python访问资源文件的方式

新手上路,请多包涵

在 python 程序中访问资源的正确方法是什么。

基本上在我的许多 python 模块中,我最终都会编写这样的代码:

   DIRNAME = os.path.split(__file__)[0]

  (...)

  template_file = os.path.join(DIRNAME, "template.foo")

这没关系,但是:

  • 如果我开始使用 python zip 包,它将中断
  • 这是样板代码

在 Java 中,我有一个功能完全相同 — 但当代码位于一堆文件夹中和打包在 .jar 文件中时都有效。

Python 中是否有这样的函数,或者是否有我可能使用的任何其他模式。

原文由 jb. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 947
2 个回答

您需要查看使用 stdlib 中的 get_data 或来自 setuptools /distribute 的 pkg_resources。您使用哪一个可能取决于您是否已经使用 distribute 将您的代码打包为 egg。

原文由 stderr 发布,翻译遵循 CC BY-SA 3.0 许可协议

从 Python 3.7 版本开始,访问资源中文件的正确方法是使用 importlib.resources 库。

例如,可以使用 path 函数访问 Python 包中的特定文件:

 import importlib.resources

with importlib.resources.path("your.package.templates", "template.foo") as template_file:
    ...

从 Python 3.9 开始,此包引入了 files() API,优于旧版 API。

可以使用 files 函数访问 Python 包中的特定文件:

 template_res = importlib.resources.files("your.package.templates").joinpath("template.foo")
with importlib.resources.as_file(template_res) as template_file:
    ...

对于旧版本,我建议安装和使用 importlib-resources 库。该文档还详细说明了如何使用 pkg_resources 将旧实现迁移到 importlib-resources

原文由 Laurent LAPORTE 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏