Подтвердить что ты не робот

Пакет Python: файлы данных правильно помещаются в файл tar.gz, но не установлены в виртуальную среду

Я не могу правильно установить проект package_fiddler в свою виртуальную среду.

Я выяснил, что MANIFEST.in отвечает за то, что для файлов non.py в Package_fiddler-0.0.0.tar.gz генерируется при выполнении python setup.py sdist.

Тогда я сделал:

(virt_envir)$ pip install dist/Package_fiddler-0.0.0.tar.gz

Но это не установило файлы данных и пакет для /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages.

Я пробовал много конфигураций параметров настройки package_data, include_package_data и data_files, но я, кажется, использовал неправильную конфигурацию каждый раз.

Какая конфигурация package_data и/или include_package_data и/или data_files правильно установит package_fiddler в мою виртуальную среду?

Дерево проектов

.
├── MANIFEST.in
├── package_fiddler
│   ├── data
│   │   ├── example.html
│   │   └── stylesheets
│   │       └── example.css
│   └── __init__.py
├── README.rst
└── setup.py

setup.py

from setuptools import setup


setup(
    name='Package_fiddler',
    entry_points={
    'console_scripts': ['package_fiddler = package_fiddler:main', ],},
    long_description=open('README.rst').read(),
    packages=['package_fiddler',])

MANIFEST.in

include README.rst
recursive-include package_fiddler/data *

Какие конфигурации setup.py(с базой кода выше) я попробовал?

Configuration1

Добавление:

package_data={"": ['package_fiddler/data/*',]}

Configuration2

Добавление:

package_data={"": ['*.html', '*.css', '*.rst']}

Configuration3

Добавление:

include_package_data=True

Configuration4

Добавление:

package_data={"": ['package_fiddler/data',]}

Удаление:

packages=['package_fiddler',]

Конфигурация5 (предложение Криса)

Добавление:

package_data={"data": ['package_fiddler/data',]}

Удаление:

packages=['package_fiddler',]

Конфигурация 6

Добавление:

package_data={"": ['package_fiddler/data/*',]}

Удаление:

packages=['package_fiddler',]

Эти конфигурации приводят к тому, что на /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages не установлены никакие файлы.

ИЗМЕНИТЬ

Примечание к Тошио Куратоми: В моем первоначальном посте я использовал простейшую древовидную структуру, где эта проблема возникает для ясности, но на самом деле мое дерево больше похоже на дерево ниже. Для этого дерева, как ни странно, если я только помещаю __init__.py в stylesheets, как-то все файлы данных в папке texts также установлены правильно!!! Это меня озадачивает.

Дерево 2 (это правильно устанавливает все файлы данных!)

.
├── MANIFEST.in
├── package_fiddler
│   │── stylesheets
|   |     ├── __init__.py
|   |     ├── example.css  
|   |     └── other
|   |          └── example2.css
|   |__ texts
|   |     ├── example.txt  
|   |     └── other
|   |          └── example2.txt
│   └── __init__.py
├── README.rst
└── setup.py
4b9b3361

Ответ 1

Мне лично не нравится, как setuptools смешивает код и данные как концептуально, так и реалистично. Я думаю, что это такая реализация, которая отключает вас здесь. Для setuptools для поиска и использования package_data необходимо, чтобы данные находились внутри пакета python. Пакет python может быть каталогом, но в каталоге должен быть файл __init__.py. Итак, похоже, что вам нужны следующие (пустые файлы):

./package_fiddler/data/__init__.py
./package_fiddler/data/stylesheets/__init__.py

Ответ 2

Нашел решение, которое сработало для меня здесь.

Используя setuptools==2.0.2, я сделал:

setuptools.setup(
    ...
    packages=setuptools.find_packages(),
    include_package_data=True,  # use MANIFEST.in during install
    ...
)

Ответ 3

Самый простой способ включить данные пакета в "setup.py" выглядит так:

package_data = {'<package name>': ['<path to data file within package dir>']}

Итак, в вашем примере:

package_data = {'package_fiddler': ['data/*', 'data/stylesheets/*']}

package_data - словарь, в котором ключи являются именами пакетов, включенных в программу установки. Значениями под этими ключами должны быть списки определенных путей к файлам или globs/wildcards в каталоге пакета.

Вам также необходимо включить флаг:

zip_safe=False

в setup(...), если вы хотите иметь возможность разрешать пути файловой системы к вашим данным. В противном случае вы можете использовать pkg_resources для этого: http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources

Вам определенно не нужен файл __init__.py в каталоге "data" - этот каталог не является модулем и не предназначен для импорта.

Ответ 4

Это работает для меня. Надеюсь, поможет.

package_data={
    "package_fiddler": [
        '\*.\*',
        '\*/\*.\*',
        '\*/\*/\*.\*',
    ],
},

Ответ 5

использовать

package_data={"data": ['package_fiddler/data',]}

вместо

packages=['package_fiddler',]