При использовании setuptools / распространять, я не могу заставить установщик вытянуть какие-либо 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/
расположение файлов данных.
python
setuptools
distribute
cmcginty
источник
источник
data_files
решило проблему. Но это подвержено ошибкам и не "чувствует себя хорошо" для меня. Может кто - то проверить , что это действительно необходимо дублировать конфигурацию в обоихpackage_data
иdata_files
?pyproject.toml
. Нетsetup.py
не требуется файл.Ответы:
Я понимаю, что это старый вопрос, но для людей, которые находят свой путь через Google:
package_data
это грязная ложь . Он используется только при сборке бинарных пакетов (python setup.py bdist ...
), но не при сборке пакетов с исходным кодом (python setup.py sdist ...
). Это, конечно, смешно - можно было бы ожидать, что создание исходного дистрибутива приведет к коллекции файлов, которые могут быть отправлены кому-то еще для создания бинарного дистрибутива.В любом случае, использование
MANIFEST.in
будет работать как для двоичного, так и для исходного дистрибутива.источник
package_data
работаетbdist
и нетsdist
. Тем не менее ,MANIFEST.in
работает дляsdist
, но не дляbdist
! Поэтому лучшее, что я смог придумать, - это включить и то,package_data
и другоеMANIFEST.in
, чтобы учесть и то,bdist
и другоеsdist
.MANIFEST.in
для файлов, которые вы не будете устанавливать, например,package_data
для документации, и для файлов, которые вы используете, которые не являются кодом Python (например, изображение или шаблон).MANIFEST.in
иpackage_data
. Кажется, что онMANIFEST.in
контролирует то, что входит в дистрибутив, а package_data контролирует то, что впоследствии копируется в каталог site_packages во время установки. Путаница в путяхMANIFEST.in
относительно расположения setup.py иpackage_data
относительно корня отдельных пакетов (например, модулей).package_data
автоматически включаются в ZIP- архив , только если у вас нет файла MANIFEST.in , и только если вы используете версию 2.7+.У меня была такая же проблема. Решение было просто удалить
include_package_data=True
.После прочтения здесь , я понял , что
include_package_data
цели включать файлы из контроля версий , а не просто «включает в себя данные пакета» , как следует из названия. Из документов:Устранение этого аргумента исправило его, что, по совпадению, также сработало, когда вы переключились на distutils, поскольку он не принимает этот аргумент.
источник
include_package_data=True
записи. Единственное решение для меня - добавить запись в манифест, как предложено выше. Имейте в виду, я использовал setuptools, может быть, ваша версия работает с «распространять»?include_package_data
проблемы решает далее в оригинальном тексте - При использовании Setuptools специфичногоinclude_package_data
аргумента, файлы , указанныеpackage_data
не будет автоматически добавлены к манифесту , если они не указаны вMANIFEST.in
файле.package_data
установки непустого списка и указанияinclude_package_data=False
? И зачем вам нужно указывать файлы дважды вMANIFEST.in
иpackage_data
?Следование рекомендации @Joe по удалению
include_package_data=True
строки также сработало для меня.Чтобы уточнить немного, у меня нет
MANIFEST.in
файла. Я использую Git, а не CVS.Репозиторий принимает такую форму:
setup.py
:Я бегу
python setup.py sdist
за исходным дистрибутивом (не пробовал бинарный).И когда внутри совершенно новой виртуальной среды, у меня есть
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. Похоже, дистрибутив устарел и / или не работает.
источник
include_package_data=True
не было чести. Таким образом, с этим параметром вам нужен только MANIFEST.in - не нужно дублировать список файлов вpackage_data
настройке.Древний вопрос и все же ... пакетное управление python действительно оставляет желать лучшего. Поэтому у меня был сценарий использования установки pip локально в указанный каталог, и я был удивлен, что пути package_data и data_files не сработали. Я не был заинтересован в добавлении еще одного файла в репозиторий, поэтому в итоге я использовал data_files и параметр setup.py --install-data; что-то вроде этого
источник
Перемещение папки с данными пакета в папку модуля решило проблему для меня.
Смотрите этот вопрос: MANIFEST.in игнорируется в "python setup.py install" - файлы данных не установлены?
источник
У меня была такая же проблема в течение нескольких дней, но даже эта ветка не смогла мне помочь, потому что все сбивало с толку. Поэтому я провел исследование и нашел следующее решение:
Полный другой ответ на стеке здесь
источник
Просто удалите строку:
из вашего скрипта установки, и он будет работать нормально. (Протестировано только сейчас с последними установочными инструментами.)
источник
sdist
иbdist_wheel
ты проверил почему?sdist
игнорирует,package_data
когда это установлено.Использование setup.cfg (setuptools ≥ 30.3.0)
Начиная с setuptools 30.3.0 (выпущен 2016-12-08), вы можете сохранить
setup.py
очень маленький размер и перенести конфигурацию вsetup.cfg
файл. При таком подходе вы можете поместить данные вашего пакета в[options.package_data]
раздел:В этом случае ваш
setup.py
может быть коротким как:Для получения дополнительной информации см. Настройка настройки с использованием файлов setup.cfg .
Есть некоторые разговоры об осуждении
setup.cfg
в пользу того,pyproject.toml
что предложено в PEP 518 , но это все еще временно на 2020-02-21.источник
pip install
.pip install
, что для достаточно современных версий pip сначала нужно создать колесо, а затем установить его. Тем не менее, для многих пользователей этот подход не будет включать данные пакета. См. Принятый ответ и комментарии под ним для подробностей об этом. Наsetup.cfg
самом деле использование a - это просто другой способ записать, что ОП уже делал вsetup.py
вопросе (передаваяpackage_data
аргумент ключевого слова в вызовеsetup
), поэтому я не думаю, что это особенно полезно в качестве ответа на этот вопрос . Это не решение основной проблемы вообще.