如何使用 python setup.py 打包非代码数据

How do I package non-code data with python setup.py

提问人:Amin Ba 提问时间:8/24/2022 最后编辑:Amin Ba 更新时间:8/24/2022 访问量:186

问:

我有一个具有以下结构的 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/staticfoo.py

我该如何处理?another file with space in name.pdf

注意:我正在使用此处建议的方法 https://stackoverflow.com/a/36693250/11065874

延伸阅读:

Python setuptools setup.py

评论

0赞 jsbueno 8/24/2022
我不会以“重复”结束,因为您在那里做了一些研究 - 但请检查:stackoverflow.com/q/1612733 - 那里的较新答案反映了可能有效的方法,包括我在 ~2019 年的答案:stackoverflow.com/a/57932258/108205
0赞 Amin Ba 8/24/2022
我该怎么办?删除?我这样做了,我遇到了同样的问题。静态目录甚至没有显示在 site_packages/lib 下package_data={'': extra_files},
0赞 Amin Ba 8/24/2022
@jsbueno 我有所有文件下的问题出在我的代码下venv/Lib/site_packages/staticfoo.py
0赞 wim 8/24/2022
检查如何从 Python 包中读取(静态)文件?
0赞 Amin Ba 8/24/2022
@wim我只是在读那个。对我来说是有区别的。我需要从 .怎么做呢?从内部 我想读取子目录中的文件importlib.resourcesmy_pckg/foo.pystatic

答:

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.parentos.path.join/ _path = Path(__file__).resolve().parent.parent / "static" / "sub_dir1" / "data_1.yaml"