Python: «Включить» внешний файл как строковую константу - PullRequest
0 голосов
/ 07 июля 2019

В моей программе на Python у меня есть несколько шейдерных программ GLSL.Поскольку они довольно большие, они хранятся в своих собственных файлах, а не в строковых литералах.

Однако их использование в качестве строковых литералов облегчит их объединение с классами Python, которые их используют, изагрузить их во время выполнения.Я могу попытаться сделать трюки с __file__, чтобы найти их, но я не уверен, как это будет работать, если программа Python была скомпилирована в файл EXE или Zip.

Есть ли способ "включить"текстовый файл как содержимое строки во время компиляции, так что моей программе не нужно беспокоиться о том, как найти файл?Или каким-то стандартным способом разместить / загрузить такие файлы, которые будут работать в этих ситуациях?

Меня интересует только Python 3, если он имеет значение.

1 Ответ

1 голос
/ 07 июля 2019

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

...