#python
#python
Вопрос:
В программе, и, очевидно, под влиянием того, как работает Java, я хочу прочитать статический файл (на самом деле файл конфигурации журнала) из каталога в PYTHONPATH интерпретатора. Я знаю, что мог бы сделать что-то вроде:
import foo
a = foo.__path__
conf = open(a[0] "/logging.conf")
но я не знаю, является ли это «питоновским» способом выполнения действий. Как я мог бы распространить файл конфигурации ведения журнала таким образом, чтобы мое приложение не нуждалось во внешней настройке для его чтения?
Комментарии:
1. Смотрите этот блог: dotnot.org/blog/archives/2004/03/06/find-a-file-in-pythons-path
Ответ №1:
В общем, это нормально, хотя я не уверен, что вам нужно a[0]
приведенное выше (это просто даст вам первый символ пути), и вам следует использовать os.path.join
вместо простого добавления /
, чтобы быть кросс-платформенным совместимым. Вы могли бы подумать о том, чтобы сделать путь каноническим, т. Е. os.path.abspath(os.path.dirname(foo.__path__))
. Обратите внимание, что он не будет работать, если __path__
находится в zip-файле или используется другая уловка импорта, но я бы не стал беспокоиться об этом (это ненормально для основной программы на Python, в отличие от Java).
Если вы действительно хотите поддерживать архивированные файлы, есть pkg_resources, но на данный момент это несколько устарело (в новом модуле packaging я не смог увидеть соответствующего API).
Комментарии:
1. Спасибо за ответ. В основном я искал подтверждение того, что мой метод достаточно Pythonic, поэтому я не обращал особого внимания на сам код.
Ответ №2:
Вот фрагмент, основанный на ссылке, которую Никс разместил в верхнем потоке, но написанный в более функциональном стиле:
def search_path(pathname_suffix):
cands = [os.path.join(d,pathname_suffix) for d in sys.path]
try:
return filter(os.path.exists, cands)[0]
except IndexError:
return None