Я ищу способ добавить не кодирующие файлы в дистрибутив.
На данный момент мне удается добавлять файлы в пакеты, но кажется странным делать пакет 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
Контейнер