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