2012-06-27 10 views
10

Ich habe eine Python-Bibliothek, die neben regulären Python-Modulen einige Datendateien enthält, die in /usr/local/lib/python2.7/dist-package/mylibrary gespeichert werden müssen.setup.py installiert keine Datendateien

Leider konnte ich setup.py nicht überzeugen, die Dateien dort zu installieren. Beachten Sie, dass dieses Verhalten unter Installation ist - nicht sdist.

hier eine leicht redigiert Version von setup.py ist

module_list = list_of_files 

setup(name   ='Modules', 
     version  ='1.33.7', 
     description ='My Sweet Module', 
     author  ='PN', 
     author_email ='email', 
     url   ='url', 
     packages  = ['my_module'], 

# I tried this. It got installed in /usr/my_module. Not ok. 

     # data_files = [ ("my_module", ["my_module/data1", 
     #         "my_module/data2"])] 

# This doesn't install it at all. 
     package_data = {"my_module" : ["my_module/data1", 
            "my_module/data2"] } 
    ) 

Dies ist in Python 2.7 (wird in 2.6 schließlich laufen), und muss auf einigen Ubuntu zwischen 10.04 und 12 Jahren laufen. Entwickeln Sie es jetzt am 12.04.

Antwort

4

http://docs.python.org/distutils/setupscript.html#installing-additional-files

Wenn ein Verzeichnis relativen Pfad ist, wird interpretiert relativ zum Installation Präfix (Python sys.prefix für rein Python Paketen sys.exec_prefix für Pakete, die Erweiterungsmodule enthalten).

Dies wird wahrscheinlich tun es:

data_files = [ ("my_module", ["local/lib/python2.7/dist-package/my_module/data1", 
           "local/lib/python2.7/dist-package/my_module/data2"])] 

Oder nur beitreten verwenden das Präfix hinzuzufügen:

data_dir = os.path.join(sys.prefix, "local/lib/python2.7/dist-package/my_module") 
data_files = [ ("my_module", [os.path.join(data_dir, "data1"), 
           os.path.join(data_dir, "data2")])] 
+0

Hmmm. Zögern Sie nicht, den Pfad fest zu codieren, aber das könnte jetzt funktionieren. –

+4

Ich habe distutils.sysconfig.get_python_lib() + "path" verwendet und das als Schlüssel verwendet. –

+0

Dies ist nicht der richtige Weg, um es zu tun. 'data_files' bezieht sich auf Dateien, die Sie unter/usr speichern möchten (z. B. Symbole, .desktop-Dateien usw.). Wenn Sie Daten zusammen mit Ihrem Python-Modul einfügen möchten, verwenden Sie 'package_data' zusammen mit dem Flag 'include_package_data = True'. – Grumbel

13

UPD: package_data akzeptiert dict im Format {'package': ['list', 'of?', 'globs*']}, so zu machen Es funktioniert, sollte man Shell-Globlen relativ zum Paketverzeichnis angeben, nicht die Dateipfade relativ zum Verteilungsstammverzeichnis.

data_files hat eine andere Bedeutung und im Allgemeinen sollte man diesen Parameter vermeiden.

Mit Setuptools Sie brauchen nur include_package_data=True, sondern Datendateien sollten auf Setuptools unter Versionskontrollsystem, bekannt sein (standardmäßig erkennt nur CVS und SVN, installieren setuptools-git oder setuptools-hg wenn Sie git verwenden oder hg ...)


mit Setuptools können Sie:

- in MANIFEST.im:

include my_module/data* 

- in setup.py:

setup(
     ... 
     include_package_data = True, 
     ... 
    ) 
+0

hm. Das ist ein bisschen kurz. Können Sie näher erläutern, was die jeweiligen Aktionen bewirken? Und muss ich beides oder beides tun? –

+0

https://pythonhosted.org/setuptools/setuptools.html # including-data-files – podshumok

+0

Dies ist die Methode, die unabhängig von der Plattform funktioniert. Wenn ich die akzeptierte Antwort benutzte, funktionierte es unter Mac OS, aber auf einer Linux VM wurden die Datendateien an seltsame Orte kopiert. –