Как включить данные пакета с 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 установить" - файлы данных не установлены?