В моей программе на Python у меня есть несколько шейдерных программ GLSL. Поскольку они довольно большие, они хранятся в отдельных файлах, а не в строковых литералах.
Однако если они будут строковыми литералами, будет проще хранить их в комплекте с классами Python, которые их используют, и загружать их во время выполнения. Я могу попытаться найти их с помощью __file__, но я не уверен, как это сработает, если программа Python будет скомпилирована в файл EXE или Zip.
Есть ли способ «включить» текстовый файл в качестве содержимого строки во время компиляции, чтобы моей программе не нужно было беспокоиться о том, как найти файл? Или какой-то стандартный способ размещения/загрузки таких файлов, который будет работать в этих ситуациях?
Меня интересует только Python 3, если это имеет значение.






Попробуйте использовать 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 может импортировать пакет, содержащий ресурсы, он может загрузить ресурс.
Спасибо, это именно то, что я искал!