如何在包内分发外添加资源?

时间:2018-10-30 20:02:13

标签: python python-3.x package

我正在寻找一种在分发包中添加非编码文件的方法。 现在,我成功地在包中添加了文件,但是为与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 answerthis 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_dataresource_filename是为包装设计。

我尝试在this documentation for distutils之后用package_data替换data_files = [('myapp-data',['data/text'])]指令(我知道setuptoolsdistutils已经合并在一起了。)

这包括我的文件(copying data/text -> build/bdist.linux-x86_64/egg/myapp-data),但是我不知道如何从我的代码访问它。

所有这些代码都在docker python:3.6-strech容器中执行

0 个答案:

没有答案