提问人:Amin Ba 提问时间:8/24/2022 最后编辑:Amin Ba 更新时间:8/24/2022 访问量:186
如何使用 python setup.py 打包非代码数据
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:如果我在目录中打开python控制台,它会像我预期的那样工作my-project
from abc.my_pckg.foo import content
...
方法2:如果我运行,它也可以按照我的预期工作
python abc/foo.py
方法3:现在我想使用 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=[],
)
然后我通过runnig生成whl文件python setup.py bdist_wheel --dist=dist
然后将 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'\
我应该如何解决这个问题?我应该如何用python打包静态数据?
我希望能够使用上面的三种方法来运行代码
注意:安装后,我有所有文件下的问题是我拥有的代码venv/Lib/site_packages/static
foo.py
我该如何处理?another file with space in name.pdf
注意:我正在使用此处建议的方法 https://stackoverflow.com/a/36693250/11065874
延伸阅读:
答:
0赞
Amin Ba
8/24/2022
#1
我通过将代码更改为
#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)
评论
1赞
jsbueno
8/24/2022
如果您调用 Path 的方法,我会更加一致,更安全,如 .此外,如果您已经在使用 pathlib,则无需使用繁琐的调用:可以使用运算符组合 Path 对象。总而言之,你可以写:resolve()
Path(__file__).resolve().parent.parent
os.path.join
/
_path = Path(__file__).resolve().parent.parent / "static" / "sub_dir1" / "data_1.yaml"
评论
package_data={'': extra_files},
venv/Lib/site_packages/static
foo.py
importlib.resources
my_pckg/foo.py
static