在我的Python程序中,我有一些GLSL着色器程序。由于这些文件很大,因此它们存储在自己的文件中,而不是存储在字符串文字中。
但是,将它们作为字符串文字会使它们更容易与使用它们的Python类捆绑在一起,并在运行时加载它们。我可以尝试用__file__
来找到技巧,但是我不确定如果将Python程序编译成EXE或Zip文件,那将如何工作。
在编译时,是否有任何方法可以将文本文件“包含”为字符串的内容,从而使我的程序不必担心如何查找文件?还是一些标准的方式来放置/加载在这种情况下可以使用的文件?
如果重要的话,我只关心Python 3。
答案 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文件中,则此方法仍然可以使用,但是必须确保资源文件实际上包含在存档中。使用zipapp
,setup.py
等时,请谨慎使用全局标记和过滤器。 resources
使用Python的导入系统,因此,基本上,如果Python可以导入包含资源的包,它就可以加载资源。