Доступ к файлам данных до и после distutils / setuptools
-
10-07-2019 - |
Вопрос
Я делаю независимое от платформы приложение PyQt. Я намерен использовать для записи файлов setup.py с помощью setuptools. До сих пор мне удалось обнаружить платформу, например, загрузить определенные параметры для setup () в зависимости от платформы, чтобы использовать py2exe в Windows ... и т. д.
Однако, с моим приложением я распространяю некоторые темы, HTML и изображения, мне нужно загрузить эти изображения в приложение во время выполнения. Пока они хранятся в каталоге themes / приложения.
Я читал документацию по setuptools и distutils и выяснил, что если бы я дал setup () опции data_files со всеми файлами в каталоге themes /, которые нужно установить в " share / MyApp / themes / " он будет установлен с префиксом / usr / или любым другим sys.prefix на платформе. Я предполагаю, что я найду файлы данных, используя nomatter os.path.join (sys.prefix, «share» »,« MyApp »,« themes »), на какой платформе я работаю, верно?
Однако я хочу иметь возможность доступа к файлам данных также во время разработки, где они находятся в каталоге themes / относительно источника приложения. Как мне это сделать? Есть ли какой-нибудь умный способ выяснить, установлено ли приложение? Или утилита, которая отображает файлы данных независимо от того, где они находятся в данный момент?
Я бы очень не хотел добавлять всевозможные уродливые хаки, чтобы посмотреть, есть ли темы, относящиеся к источнику, или в sys.prefix / share ... и т.д ... Как я могу найти там файлы данных во время разработки? а после установки на произвольную платформу?
Решение
Я использовал служебный метод с именем data_file:
def data_file(fname):
"""Return the path to a data file of ours."""
return os.path.join(os.path.split(__file__)[0], fname)
Я помещаю это в файл init .py в моем проекте, а затем вызываю его из любого места в моем пакете, чтобы получить файл, относящийся к пакету.
Setuptools предлагает аналогичную функцию, но для этого не нужны setuptools.
Другие советы
Вы можете попробовать pkg_resources
а>:
my_data = pkg_resources.resource_string(__name__, fname)
Вам следует использовать модуль pkgutil / pkg_resources для загрузки файлов данных , Это даже работает изнутри молнии яиц.