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.
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 .
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.
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.
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)
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'],
},
)
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
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'],
},
)
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?