Как включить данные пакета с setuptools / distribute?
при использовании setuptools / distribute, я не могу заставить установщик тянуть в любой package_data файлы. Я везде читала, что правильный способ сделать это. Может кто-нибудь посоветует?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
здесь myapp/data/ расположение файлов данных.
7 ответов:
Я понимаю, что это старый вопрос...но для людей, которые находят там путь сюда через Google:
package_dataнизкий-вниз, грязная ложь. Он используется только при строительстве binary пакеты (python setup.py bdist ...), но не при создании исходных пакетов (python setup.py sdist ...). Это, конечно, смешно - можно было бы ожидать, что создание исходного дистрибутива приведет к созданию коллекции файлов, которые могут быть отправлены кому-то другому для создания двоичного файла распределение.в любом случае, используя
MANIFEST.inсовместимость и для двоичных и исходных распределениях.
у меня просто была такая же проблема. Решение было просто удалить
include_package_data=True.после читать здесь, я понял, что
include_package_dataстремится включить файлы из контроля версий, а не просто "включить данные пакета", как следует из названия. Из документов:файлы данных [include_package_data] должны находиться под управлением CVS или Subversion
...
Если вы хотите более детальный контроль над какие файлы включены (например, если у вас есть файлы документации в каталогах пакетов и вы хотите исключить их установка), то вы также можете использовать
package_dataключевое слово.вынимая этот аргумент, исправил его, что по совпадению также сработало, когда вы переключились на distutils, так как он не принимает этот аргумент.
следуя рекомендации @Joe, чтобы удалить
include_package_data=Trueлиния также работала для меня.чтобы уточнить немного больше, у меня есть нет. Я использую Git, а не CVS.
репозиторий принимает такую форму:
/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... ], }, )Я бегу
python setup.py sdistдля исходного дистрибутива (не пробовал двоичный).и когда внутри совершенно новой виртуальной среды, у меня есть
myproject-4.19.tar.gz, файл, и я используйте(venv) pip install ~/myproject-4.19.tar.gz ...и кроме всего, что устанавливается в мою виртуальную среду
site-packages, эти специальные файлы данных устанавливаются в/opt/local/myproject/dataи/opt/local/myproject/etc.
include_package_data=Trueработал для меня.если вы используете Git, не забудьте включить
setuptools-gitininstall_requires. Гораздо менее скучно, чем иметьManifestили включая весь путь вpackage_data( в моем случае это приложение Django со всеми видами статика )( вставить комментарий, который я сделал, как k3-rnc упоминалось, что это действительно полезно, как есть)
обновление: этот ответ старый, и информация больше не действительна. Все setup.py конфигурации должны использовать
import setuptools. Я добавил Более полный ответ на https://stackoverflow.com/a/49501350/64313
Я решил это, переключившись на distutils. Похоже, что distribute устарел и / или сломан.
from distutils.core import setup setup( name='myapp', packages=['myapp'], package_data={ 'myapp': ['data/*.txt'], }, )
древний вопрос и все же... управление пакетами python действительно оставляет желать лучшего. Поэтому у меня был случай использования установки с использованием pip локально в указанный каталог и был удивлен, что пути package_data и data_files не сработали. Я не был заинтересован в добавлении еще одного файла в репо, поэтому я в конечном итоге использовал data_files и setup.py опция --install-data; что-то вроде этого
pip install . --install-option="--install-data=$PWD/package" -t package
перемещение папки, содержащей данные пакета в папку модуля, решило проблему для меня.
смотрите этот вопрос:MANIFEST.in игнорируется на "python setup.py установить" - файлы данных не установлены?
Comments