Как включить данные пакета с помощью 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  

Ответ 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'],
   },
)

Полный другой ответ на стеке