Как включить данные пакета с помощью 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/
- расположение файлов данных.
Ответы
Ответ 1
Я понимаю, что это старый вопрос, но для людей, которые находят здесь свой путь через Google: package_data
- низкопробная, грязная ложь. Он используется только при сборке бинарных пакетов (python setup.py bdist ...
), но не при сборке исходных пакетов (python setup.py sdist ...
). Это, конечно, смешно - можно было бы ожидать, что создание исходного дистрибутива приведет к коллекции файлов, которые могут быть отправлены кому-то еще для создания бинарного дистрибутива.
В любом случае использование MANIFEST.in
будет работать как для двоичного, так и для исходного дистрибутива.
Ответ 2
У меня была такая же проблема. Решение было просто удалить include_package_data=True
.
После здесь читайте, я понял, что include_package_data
нацелен на включение файлов из управления версиями, а не просто" включать данные пакета как следует из названия. Из документов:
Файлы данных [include_package_data] должны находиться под контролем CVS или Subversion
...
Если вам нужен более тонкий контроль над файлами (например, если у вас есть файлы документации в ваших каталогах пакетов и вы хотите исключить их от установки), то вы также можете использовать ключевое слово package_data
.
Устраняя этот аргумент, это совпадение, почему он также работал, когда вы переключались на distutils, так как он не принимает этот аргумент.
Ответ 3
Следуя рекомендации @Joe, чтобы удалить строку include_package_data=True
, также работала для меня.
Чтобы разработать немного больше, у меня есть файл no MANIFEST.in
. Я использую 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
.
Ответ 4
include_package_data=True
работал у меня.
Если вы используете git, не забудьте включить setuptools-git
в install_requires
. Гораздо менее скучно, чем иметь Manifest
или включая весь путь в package_data
(в моем случае это приложение django со всеми типами статики)
(вставил комментарий, который я сделал, поскольку k3-rnc упомянул, что он действительно полезен как есть)
Ответ 5
Обновление. Этот ответ устарел, и информация больше не действительна. Все конфиги setup.py должны использовать import setuptools
. Я добавил более полный ответ на fooobar.com/questions/165779/...
Я решил это, переключившись на distutils. Похоже, дистрибутив устарел и/или не работает.
from distutils.core import setup
setup(
name='myapp',
packages=['myapp'],
package_data={
'myapp': ['data/*.txt'],
},
)
Ответ 6
Древний вопрос и все же... управление пакетами python действительно оставляет желать лучшего. Таким образом, у меня был вариант использования локального использования pip в указанном каталоге и был удивлен, что пути пакета_даты и data_files не сработали. Я не хотел добавлять еще один файл в репо, поэтому я решил использовать data_files и параметр setup.py --install-data; что-то вроде этого
pip install . --install-option="--install-data=$PWD/package" -t package
Ответ 7
Перемещение папки, содержащей данные пакета в папку модуля, решило проблему для меня.
Посмотрите на этот вопрос: MANIFEST.in проигнорирован на" python setup.py install " - не установлены файлы данных?
Ответ 8
У меня была такая же проблема в эти пару дней, но даже эта тема не могла быть понятной для меня. Все просто сбивает с толку. Итак, я сделал свое исследование и нашел решение. В основном в этом случае вот что вы должны сделать:
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'],
},
)
Полный другой ответ на стеке