Как включить данные пакета с 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
является низким,грязная ложь. Он используется только при строительстве бинарные пакеты (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-git
на install_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
перемещение папки, содержащей данные пакета в папку модуля, решило проблему для меня.
см. этот вопрос:манифест.в игнорируется на "python setup.py установить" - файлы данных не установлены?