webentwicklung-frage-antwort-db.com.de

Wie füge ich Paketdaten in setuptools/distribute ein?

Bei der Verwendung von setuptools/distribute kann ich das Installationsprogramm nicht dazu bringen, irgendwelche package_data -Dateien abzurufen. Alles, was ich gelesen habe, besagt, dass das Folgende der richtige Weg ist. Kann jemand bitte beraten?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   Zip_safe=False,
   install_requires=['distribute'],
)

dabei ist myapp/data/ der Ort der Datendateien.

103
cmcginty

Mir ist klar, dass dies eine alte Frage ist ... aber für Leute, die hier über Google einen Weg finden: _package_data_ ist eine einfache, schmutzige Lüge . Es wird nur verwendet, wenn binäre Pakete (_python setup.py bdist ..._) erstellt werden, aber nicht beim Erstellen von Quellpaketen (_python setup.py sdist ..._). Das ist natürlich lächerlich - man würde erwarten, dass das Erstellen einer Quelldistribution zu einer Sammlung von Dateien führen würde, die an eine andere Person gesendet werden könnten, um die Binärdistribution zu erstellen.

In jedem Fall funktioniert die Verwendung von MANIFEST.in sowohl für Binärdistributionen als auch für Quelldistributionen .

240
larsks

Ich hatte gerade das gleiche Problem. Die Lösung bestand einfach darin, include_package_data=True zu entfernen.

Nach Lesen hier habe ich festgestellt, dass include_package_data Dateien aus Versionskontrolle einschließen will, im Gegensatz zu "Paketdaten einschließen", wie der Name andeutet. Aus den Dokumenten:

Die Datendateien [von include_package_data] müssen unter CVS- oder Subversion-Kontrolle stehen

...

Wenn Sie genauer steuern möchten, welche Dateien enthalten sind (z. B. wenn Sie Dokumentationsdateien in Ihren Paketverzeichnissen haben und diese aus der Installation ausschließen möchten), können Sie auch das Schlüsselwort package_data verwenden.

Wenn Sie dieses Argument herausnehmen, wurde es behoben, weshalb es auch beim Wechseln zu Distutils funktioniert hat, da es dieses Argument nicht akzeptiert.

23
Joe

Die Empfehlung von @Joe, die include_package_data=True-Zeile zu entfernen, hat auch für mich funktioniert. 

Um ein wenig mehr auszuarbeiten, habe ich die Datei no MANIFEST.in. Ich benutze Git und nicht CVS.

Repository nimmt diese Form an:

/myrepo
    - .git/
    - setup.py
    - myproject
        - __init__.py
        - some_mod
            - __init__.py
            - animals.py
            - rocks.py
        - config
            - __init__.py
            - settings.py
            - other_settings.special
            - cool.huh
            - other_settings.xml
        - words
            - __init__.py
            Word_set.txt

setup.py:

from setuptools import setup, find_packages
import os.path

setup (
    name='myproject',
    version = "4.19",
    packages = find_packages(),  
    # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
    package_data = {
        # If any package contains *.txt or *.rst files, include them:
        '': ['*.txt', '*.xml', '*.special', '*.huh'],
    },

#
    # Oddly enough, include_package_data=True prevented package_data from working.
    # include_package_data=True, # Commented out.
    data_files=[
#               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
        ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
#
        ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
        ('/opt/local/myproject/data', [os.path.join('myproject/words', 'Word_set.txt')]),
    ],

    install_requires=[ 'jsonschema',
        'logging', ],

     entry_points = {
        'console_scripts': [
            # Blah...
        ], },
)

Ich führe python setup.py sdist für eine Quelldistribution aus (bin nicht binär versucht).

Und wenn ich mich in einer brandneuen virtuellen Umgebung befinde, habe ich eine myproject-4.19.tar.gz-Datei, Und benutze sie

(venv) pip install ~/myproject-4.19.tar.gz
...

Abgesehen davon, dass alles in site-packages meiner virtuellen Umgebung installiert wird, werden diese speziellen Datendateien in /opt/local/myproject/data und /opt/local/myproject/etc installiert.

15
HeyWatchThis

include_package_data=True arbeitete für mich.

Wenn Sie git verwenden, denken Sie daran, setuptools-git in install_requires einzuschließen. Weit weniger langweilig als eine Manifest oder alle Pfade in package_data (in meinem Fall eine Django-App mit allen Arten von Statik)

(fügte den Kommentar ein, den ich gemacht habe, als k3-rnc erwähnt, dass es tatsächlich hilfreich ist, wie es ist)

10
vincent

Update: Diese Antwort ist alt und die Informationen sind nicht mehr gültig. Alle setup.py-Konfigurationen sollten import setuptools verwenden. Ich habe eine vollständigere Antwort hinzugefügt unter https://stackoverflow.com/a/49501350/64313


Ich löste dieses Problem, indem ich zu Distutils wechselte. Sieht so aus, als ob die Verteilung veraltet und/oder defekt ist.

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)
4
cmcginty

Alte Frage und doch ... Die Paketverwaltung von Python lässt wirklich zu wünschen übrig. Ich hatte also den Anwendungsfall der Installation mit pip lokal in einem angegebenen Verzeichnis und war überrascht, dass die package_data- und data_files-Pfade nicht funktionierten. Ich war nicht daran interessiert, dem Repo eine weitere Datei hinzuzufügen, also habe ich am Ende data_files und die setup.py-Option --install-data verwendet. etwas wie das

pip install . --install-option="--install-data=$PWD/package" -t package  
3
Mat Baker

Ich hatte das gleiche Problem in diesen Tagen, aber selbst dieser Thread konnte mir nicht klar sein. Alles ist nur verwirrend. Also habe ich recherchiert und eine Lösung gefunden. Grundsätzlich sollten Sie in diesem Fall Folgendes tun:

from setuptools import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_dir={'myapp':'myapp'}, # the one line where all the magic happens
   package_data={
      'myapp': ['data/*.txt'],
   },
)

Die volle andere Stackoverflow-Antwort hier

0
mctrjalloh

Das Verschieben des Ordners mit den Paketdaten in den Modulordner löste das Problem für mich.

Siehe diese Frage: MANIFEST.in bei "python setup.py install" ignoriert - keine Datendateien installiert?

0
exhuma