Поиск файла в дистрибутиве модуля Python
14935 просмотра
4 ответа
126 Репутация автора
Я написал пакет Python, который включает в себя базу данных bsddb с предварительно вычисленными значениями для одного из более трудоемких вычислений. Для простоты мой установочный скрипт устанавливает файл базы данных в тот же каталог, что и код, который обращается к базе данных (в Unix что-то вроде /usr/lib/python2.5/site-packages/mypackage/).
Как мне сохранить окончательное местоположение файла базы данных, чтобы мой код мог получить к нему доступ? Прямо сейчас я использую хак на основе __file__
переменной в модуле, который обращается к базе данных:
dbname = os.path.join (os.path.dirname (__ file__), "database.dat")
Это работает, но кажется ... хакерским. Есть лучший способ сделать это? Мне бы хотелось, чтобы скрипт установки просто взял окончательное место установки из модуля distutils и поместил его в файл "dbconfig.py", который устанавливается вместе с кодом, который обращается к базе данных.
Автор: Paul Источник Размещён: 02.09.2008 09:40Ответы (4)
4 плюса
4488 Репутация автора
Это, вероятно, способ сделать это, не прибегая к чему-то более сложному, например, используя setuptools для установки файлов, к которым они принадлежат.
Обратите внимание, что есть проблема с этим подходом, потому что в ОС с реальной структурой безопасности (UNIX и т. Д.) Пользователь, выполняющий ваш сценарий, может не иметь прав доступа к БД в системном каталоге, где он установлен.
Автор: dguaraglia Размещён: 02.09.2008 11:4330 плюса
81919 Репутация автора
Попробуйте использовать 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 для получения ресурсов на странице яйца и на странице pkg_resources .
Также обратите внимание, что, где это возможно, рекомендуется использовать pkg_resources.resource_stream или pkg_resources.resource_string, потому что, если пакет является частью яйца, resource_filename скопирует файл во временный каталог.
Автор: Aaron Maenpaa Размещён: 02.09.2008 02:2616 плюса
5922 Репутация автора
Используйте pkgutil.get_data
. Это двоюродный брат pkg_resources.resource_stream
, но в стандартной библиотеке, и должен работать как с плоскими установками файловой системы, так и с заархивированными пакетами и другими импортерами.
0 плюса
3658 Репутация автора
Используйте стандартный importlib.resources
модуль библиотеки Python-3.7 , который более эффективен, чем setuptools:pkg_resources
(в предыдущих версиях Python используйте importlib_resources
библиотеку с обратным портированием ).
Внимание: чтобы это работало, папка, в которой находится файл данных, должна быть обычным пакетом python . Это означает, что вы должны добавить __init__.py
в него файл, если его там еще нет.
Тогда вы можете получить к нему доступ так:
try:
import importlib.resources as importlib_resources
except ImportError:
# In PY<3.7 fall-back to backported `importlib_resources`.
import importlib_resources
## Note that the actual package could have been used,
# not just its (string) name, with something like:
# from XXX import YYY as data_pkg
data_pkg = '.'
fname = 'database.dat'
db_bytes = importlib_resources.read_binary(data_pkg, fname)
# or if a file-like stream is needed:
with importlib_resources.open_binary(data_pkg, fname) as db_file:
...
Автор: ankostis
Размещён: 22.06.2019 09:51
Вопросы из категории :
- python Обработка XML в Python
- python Как я могу использовать Python itertools.groupby ()?
- python Python: На какой ОС я работаю?
- python Как я могу создать непосредственно исполняемое кроссплатформенное приложение с графическим интерфейсом на Python?
- python Вызов функции модуля с использованием его имени (строки)
- python Звук Питона («Колокол»)
- python Regex и unicode
- python Создать зашифрованный ZIP-файл в Python
- python Создайте базовый итератор Python
- python Функция транспонирования / распаковки (обратная сторона zip)?
- distutils Поиск файла в дистрибутиве модуля Python
- distutils Заставьте distutils искать правильные заголовочные файлы
- distutils Напрямую вызывать функцию setup () distutils или setuptools с именем / опциями команды, без разбора командной строки?
- distutils Как я могу заставить setuptools установить пакет, который не находится в PyPI?
- distutils Как отправить пакет в PyPi?
- distutils Можно ли требовать PyQt из setuptools setup.py?
- distutils Установка моего sdist из PyPI помещает файлы в неожиданные места
- distutils Можно ли выразить зависимую от платформы зависимость в setup.py без построения специфичных для платформы версий моего яйца?
- distutils Существует ли стандартный способ создания пакетов Debian для распространения программ на Python?
- distutils python - setup.py скопировать файл в определенное место