我正在寻找一种在分发包中添加非编码文件的方法。 现在,我成功地在包中添加了文件,但是为与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",
)
我构建了将this answer与this one混合在一起的代码
如果我运行代码(在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
可以通过按照here的说明从include_package_data=True
中删除setup.py
来解决,但似乎没人知道为什么。我还感到惊讶,python setup bdist_wheel
无需触摸此选项即可工作。
现在从那里,如果我删除data/__init__.py
文件,将data
放在简单的文件夹中,显然我会收到一个找不到模块的错误,因为package_data
和resource_filename
是为包装设计。
我尝试在this documentation for distutils之后用package_data
替换data_files = [('myapp-data',['data/text'])]
指令(我知道setuptools
和distutils
已经合并在一起了。)>
这包括我的文件(copying data/text -> build/bdist.linux-x86_64/egg/myapp-data
),但是我不知道如何从我的代码访问它。
所有这些代码都在docker python:3.6-strech
容器中执行