Python:将外部文件“包含”为字符串常量

时间:2019-07-06 21:37:42

标签: python compilation include embedded-resource

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

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

在编译时,是否有任何方法可以将文本文件“包含”为字符串的内容,从而使我的程序不必担心如何查找文件?还是一些标准的方式来放置/加载在这种情况下可以使用的文件?

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

1 个答案:

答案 0 :(得分:1)

尝试使用importlib.resources。 (请注意,这是Python 3.7中的一项新功能。)此模块的功能可以使用Python的导入系统“导入”任意文件类型。可以很简单

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等时,请谨慎使用全局标记和过滤器。 resources使用Python的导入系统,因此,基本上,如果Python可以导入包含资源的包,它就可以加载资源。