Поиск файла в дистрибутиве модуля Python - PullRequest
24 голосов
/ 02 сентября 2008

Я написал пакет Python, который включает в себя базу данных bsddb с предварительно вычисленными значениями для одного из более трудоемких вычислений. Для простоты мой установочный скрипт устанавливает файл базы данных в тот же каталог, что и код, который обращается к базе данных (в Unix что-то вроде /usr/lib/python2.5/site-packages/mypackage/).

Как мне сохранить окончательное местоположение файла базы данных, чтобы мой код мог получить к нему доступ? Прямо сейчас я использую хак на основе переменной __file__ в модуле, который обращается к базе данных:

dbname = os.path.join(os.path.dirname(__file__), "database.dat")

Это работает, но кажется ... хакерским. Есть лучший способ сделать это? Мне бы хотелось, чтобы скрипт установки просто взял окончательное место установки из модуля distutils и поместил его в файл «dbconfig.py», который устанавливается вместе с кодом, который обращается к базе данных.

Ответы [ 3 ]

29 голосов
/ 02 сентября 2008

Попробуйте использовать pkg_resources, который является частью setuptools (и доступен на всех питонах, к которым у меня есть доступ прямо сейчас):

>>> import pkg_resources
>>> pkg_resources.resource_ filename(__name__, "foo.config")
'foo.config'
>>> pkg_resources.resource_filename('tempfile', "foo.config")
'/usr/lib/python2.4/foo.config'

Более подробно обсуждается использование pkg_resources для получения ресурсов на странице egg и странице pkg_resources .

Также обратите внимание, что, где это возможно, рекомендуется использовать pkg_resources.resource_stream или pkg_resources.resource_string, потому что если пакет является частью яйца, то resource_filename скопирует файл во временный каталог.

16 голосов
/ 29 марта 2012

Используйте pkgutil.get_data. Это двоюродный брат pkg_resources.resource_stream, но в стандартной библиотеке, и должен работать как с простыми установками файловой системы, так и с заархивированными пакетами и другими импортерами.

4 голосов
/ 02 сентября 2008

Это, вероятно, способ сделать это, не прибегая к чему-то более сложному, например, используя setuptools для установки файлов, к которым они принадлежат.

Обратите внимание, что есть проблема с этим подходом, потому что в ОС с реальной структурой безопасности (UNIX и т. Д.) Пользователь, выполняющий ваш сценарий, может не иметь прав доступа к БД в системном каталоге, где он установлен.

...