Python: «Включить» внешний файл как строковую константу

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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
808
1
Перейти к ответу Данный вопрос помечен как решенный

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

Спасибо, это именно то, что я искал!

Rena 08.07.2019 18:31

Другие вопросы по теме