Python: "Include" 一个外部文件作为字符串常量

Python: "Include" an external file as a string constant

在我的 Python 程序中,我有一些 GLSL 着色器程序。由于它们相当大,因此它们存储在自己的文件中而不是字符串文字中。

但是,将它们作为字符串文字可以更轻松地将它们与使用它们的 Python 类 捆绑在一起,并在运行时加载它们。我可以尝试使用 __file__ 来找到它们,但我不确定如果 Python 程序被编译成 EXE 或 Zip 文件,那将如何工作。

有什么方法可以在编译时"include"将一个文本文件作为字符串的内容,这样我的程序就不需要担心如何定位文件了?或者一些标准的方法 place/load 可以在这些情况下工作的文件?

我只关心 Python 3,如果它重要的话。

尝试使用 importlib.resources。 (请注意,这是 Python 3.7 的新功能。)该模块具有使用 Python 的导入系统可以 "import" 任意文件类型的功能。可以简单到

from importlib import resources

my_glsl_string = resources.read_text(__package__, 'foo.frag')

其中 foo.frag 是与需要它的 .py 文件位于同一包中的某个资源文件。

如果您希望将资源保留在其他包中,您可以正常导入该包并将生成的模块对象而不是包名称作为第一个参数传递给 read_text():

from importlib import resources

import spam.eggs

my_glsl_string = resources.read_text(spam.eggs, 'foo.frag')

在这里,spam.eggs 是项目中的一些 Python 包,您可以在其中保存资源文件。


与直接文件系统调用不同,如果稍后将项目捆绑到 zip 文件中,此方法仍然有效,但您必须确保资源文件实际包含在存档中。使用 zipappsetup.py 等时要小心 glob 和过滤器。 resources 使用 Python 的导入系统,所以基本上如果 Python 可以导入 resources-containing 包,它可以加载资源。