Как включить данные пакета с помощью setuptools / distribution? - PullRequest
109 голосов
/ 23 сентября 2011

При использовании setuptools / distribue я не могу заставить установщик вытянуть любые файлы 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/ - расположение файлов данных.

Ответы [ 8 ]

238 голосов
/ 04 января 2013

Я понимаю, что это старый вопрос ... но для людей, которые находят здесь путь через Google: package_data - это низкий уровень, грязная ложь . Он используется только при сборке двоичных пакетов (python setup.py bdist ...), но не при сборке исходных пакетов (python setup.py sdist ...). Это, конечно, смешно - можно было бы ожидать, что построение исходного дистрибутива приведет к коллекции файлов, которые могут быть отправлены кому-то еще для создания бинарного дистрибутива.

В любом случае использование MANIFEST.in будет работать как для двоичного, так и для исходного дистрибутива.

28 голосов
/ 09 декабря 2012

У меня была такая же проблема.Решение было просто удалить include_package_data=True.

После чтения здесь я понял, что include_package_data стремится включать файлы из контроля версий , в отличие отпросто «включить данные пакета», как следует из названия.Из документов:

Файлы данных [include_package_data] должны находиться под контролем CVS или Subversion

...

Если вы хотите более детальный контроль надкакие файлы включены (например, если у вас есть файлы документации в каталогах ваших пакетов и вы хотите исключить их из установки), вы также можете использовать ключевое слово package_data.

Убрать этот аргументисправил это, по совпадению, почему он также работал, когда вы переключились на distutils, так как он не принимает этот аргумент.

17 голосов
/ 29 мая 2014

Следуя рекомендации @Joe по удалению строки include_package_data=True, у меня тоже получилось.

Чтобы уточнить немного, у меня есть нет 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.

11 голосов
/ 11 декабря 2015

include_package_data=True работал для меня.

Если вы используете git, не забудьте включить setuptools-git в install_requires. Гораздо менее скучно, чем иметь Manifest или включать все пути в package_data (в моем случае это приложение django со всеми видами статики)

(вставил комментарий, который я сделал, так как k3-rnc упомянул, что это действительно полезно как есть)

4 голосов
/ 10 апреля 2017

Древний вопрос и все же ... пакетное управление python действительно оставляет желать лучшего.Поэтому у меня был сценарий использования установки pip локально в указанный каталог, и я был удивлен, что пути package_data и data_files не сработали.Я не был заинтересован в добавлении еще одного файла в репозиторий, поэтому в итоге я использовал data_files и параметр setup.py --install-data;как то так

pip install . --install-option="--install-data=$PWD/package" -t package  
4 голосов
/ 23 сентября 2011

Обновление : Этот ответ старый и информация больше не действительна.Все конфиги setup.py должны использовать import setuptools.Я добавил более полный ответ на https://stackoverflow.com/a/49501350/64313


Я решил это, переключившись на distutils.Похоже, дистрибутив устарел и / или не работает.

from distutils.core import setup

setup(
   name='myapp',
   packages=['myapp'],
   package_data={
      'myapp': ['data/*.txt'],
   },
)
1 голос
/ 26 ноября 2018

У меня была такая же проблема в эти пару дней, но даже эта тема не могла быть понятной для меня. Все просто сбивает с толку. Итак, я сделал свое исследование и нашел решение. В основном в этом случае вот что вы должны сделать:

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

Полный ответ о стекопотоке

1 голос
/ 07 ноября 2011

Перемещение папки, содержащей данные пакета, в папку модуля решило проблему для меня.

См. Этот вопрос: MANIFEST.in игнорируется в "python setup.py install" - файлы данных не установлены

...