Как добавить ресурсы вне пакета внутри дистрибутива? - PullRequest
0 голосов
/ 30 октября 2018

Я ищу способ добавить не кодирующие файлы в дистрибутив. На данный момент мне удается добавлять файлы в пакеты, но кажется странным делать пакет python для файлов, которые не имеют ничего общего с кодом Python. (Но, возможно, это утверждение является источником моей проблемы).

Что работает

Это моя структура:

├── data
|   ├── __init__.py
│   └── text
├── myapp
│   ├── __init__.py
│   └── start.py
├── README.md
├── setup.py
└── tests

Вот код start.py:

from pkg_resources import resource_filename

def main():
    print('Hello world')
    my_data = resource_filename('data', 'text')
    with open(my_data, 'r') as f:
        print(f.read())

А вот мой setup.py:

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="myapp",
    version="0.0.1",
    packages=setuptools.find_packages(),
    entry_points={
        'console_scripts':[
            'myapp-run = myapp.start:main'
        ]
    },
    include_package_data=True,
    package_data={'':['text']},
    description="A python test project",
    long_description=long_description,
    long_description_content_type="text/markdown",
)

Я построил этот код, смешивая этот ответ с этим

Если я запускаю код (в Docker-контейнере для простой перезагрузки системы):

# python setup.py install
# myapp-run
Hello world
Some text

Все работает, как ожидалось.

Что для работы нужно "взломать"

Но если я создаю дистрибутив, файл данных не включается:

# python setup.py sdist
...
copying files to myapp-0.0.1...
copying README.md -> myapp-0.0.1
copying setup.py -> myapp-0.0.1
copying data/__init__.py -> myapp-0.0.1/data
copying myapp/__init__.py -> myapp-0.0.1/myapp
copying myapp/start.py -> myapp-0.0.1/myapp
copying myapp.egg-info/PKG-INFO -> myapp-0.0.1/myapp.egg-info
copying myapp.egg-info/SOURCES.txt -> myapp-0.0.1/myapp.egg-info
copying myapp.egg-info/dependency_links.txt -> myapp-0.0.1/myapp.egg-info
copying myapp.egg-info/entry_points.txt -> myapp-0.0.1/myapp.egg-info
copying myapp.egg-info/top_level.txt -> myapp-0.0.1/myapp.egg-info
Writing myapp-0.0.1/setup.cfg
Creating tar archive

Это можно исправить, удалив include_package_data=True из setup.py, как указано здесь , но никто, кажется, не знает почему. Я также удивлен, что python setup bdist_wheel работает без необходимости касаться этой опции.

Что не работает вообще

Теперь, если я удалю файл data/__init__.py, превратив data в простую папку, я, очевидно, получу сообщение об ошибке модуля не найден, так как package_data и resource_filename предназначены для пакетов.

Я попытался заменить инструкцию package_data на data_files = [('myapp-data',['data/text'])], следуя этой документации для distutils (я понял, что setuptools и distutils были объединены в одной точке).

Это включает в себя мой файл (copying data/text -> build/bdist.linux-x86_64/egg/myapp-data), но я не знаю, как получить к нему доступ из своего кода.

Весь этот код выполняется в докере python:3.6-strech Контейнер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...