![](/img/trans.png)
[英]How do I build a py2 wheel package, when setup.py runs with a Python version 3 interpreter?
[英]How do I package non-code data with python setup.py
我有一个具有以下结构的 python 项目
my-project
venv
tests
setup.py
abc
__init__.py
my_pckg
__init__.py
foo.py
static
data_0.txt
sub_dir1
data_1.yaml
sub_dir2
data_2.csv
another file with space in name.pdf
假设在abc/foo.py
我有
#abc/foo.py
import os
import yaml
with open(os.path.join("abc", "static", "sub_dir1", "data_1.yaml"), "r") as f:
content= yaml.safe_load(stream)
if __name__ == "__main__":
print(content)
方法 1:如果我在my-project
目录中打开 python 控制台,它会按预期工作
from abc.my_pckg.foo import content
...
方法 2:如果我运行,它也能按预期工作
python abc/foo.py
方法 3:现在我想 package 使用 setup.py 文件的代码如下
import setuptools
import os
def package_files(directory):
paths = []
for (path, directories, filenames) in os.walk(directory):
for filename in filenames:
paths.append(os.path.join('..', path, filename))
return paths
extra_files = package_files('abc/static')
setuptools.setup(
name="some-name",
version="0.1.0",
package_dir={"abc": "abc"},
include_package_data=True,
package_data={'': extra_files},
packages=[
"abc",
"bma.my_pckg",
],
python_requires=">=3.6",
install_requires=[],
)
然后我通过python setup.py bdist_wheel --dist=dist
生成 whl 文件
然后将 whl 文件移动到我希望安装的位置并运行pip install...
来安装它
new-project
venv
但是,当我尝试这样做时,出现此错误
File "abs-path-to-new-poject\venv\lib\site-packages\abc\my_pckg\foo.py", line , in <module>
with open(os.path.join("abc", "static", "sub_dir1", "data_1.txt"), "r") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'abc\\static\\data_1.yaml'\
我该如何解决? 我应该如何将package static数据与python?
我希望能够使用上面的三种方法来运行代码
注意:安装后,我在venv/Lib/site_packages/static
下有所有文件问题是我在foo.py
中的代码
以及如何处理another file with space in name.pdf
?
注意:我正在使用这里建议的方法https://stackoverflow.com/a/36693250/11065874
进一步阅读:
我应该使用 pkg_resources 吗? https://kiwidamien.github.io/making-a-python-package-vi-including-data-files.html
我应该使用 import_lib 吗? 如何? https://dev.to/bowmanjd/easily-load-non-python-data-files-from-a-python-package-2e8g
我通过将代码更改为解决了我的问题
#abc/foo.py
import os
import yaml
_path = os.path.join(Path(__file__).parent.parent, "static", "sub_dir1", "data_1.yaml")
with open(_path, "r") as stream:
content= yaml.safe_load(stream)
if __name__ == "__main__":
print(content)
我相信您正在寻找设置工具的data_files
选项。
data_files 选项可用于指定模块分发所需的附加文件:配置文件、消息目录、数据文件,以及任何不属于前面类别的文件。 data_files 以下列方式指定一系列(目录、文件)对:
setup(..., data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), ('config', ['cfg/data.cfg'])], )
序列中的每个 (directory, files) 对指定安装目录和要安装在那里的文件。 files 中的每个文件名都相对于 setup.py 脚本进行解释。
有关设置工具的许多不同关键字 arguments 的更多信息,请参阅此答案。
data_files
选项的文档在这里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.