Доступ к файлам данных до и после distutils / setuptools - PullRequest
11 голосов
/ 02 августа 2009

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

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 02 апреля 2010

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

my_data = pkg_resources.resource_string(__name__, fname)
6 голосов
/ 13 сентября 2010

Вы должны использовать модуль pkgutil / pkg_resources для загрузки файлов данных . Это даже работает изнутри яиц на молнии.

5 голосов
/ 02 августа 2009

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

...