Подтвердить что ты не робот

Доступ к файлам данных до и после distutils/setuptools

Я использую независимое от платформы приложение PyQt. Я намерен использовать файл setup.py, используя setuptools. До сих пор мне удалось установить платформу, например, загружать определенные параметры для установки() в зависимости от платформы, чтобы использовать py2exe для Windows... и т.д.

Однако, с моим приложением я распространяю некоторые темы, HTML и изображения, мне нужно загрузить эти изображения в приложение во время выполнения. Пока они хранятся в каталоге тем/приложения.

Я читал документацию по setuptools и distutils и выяснил, что если бы я дал setup() параметры data_files со всеми файлами в каталоге тем /, которые будут установлены в "share/MyApp/themes/", это будет быть установлен с /usr/prefix или любым sys.prefix на платформе. Я предполагаю, что я найду файлы данных, используя os.path.join(sys.prefix, "share", "MyApp", "themes" ), номенуют, на какой платформе я работаю, правильно?

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

Мне бы очень хотелось добавить всевозможные уродливые хаки, чтобы узнать, есть ли темы относительно источника, или в sys.prefix/share... и т.д. Как найти файлы данных во время разработки? и после установки на произвольную платформу?

4b9b3361

Ответ 1

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

Ответ 2

Вы можете попробовать pkg_resources:

my_data = pkg_resources.resource_string(__name__, fname)