Открыть файл из PYTHONPATH

#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