2016-09-01 7 views
0

я иметь следующую структуру каталогов для программы, которую я пишу в Python:Как создать файл конфигурации python, в котором определены относительные пути, но когда скрипты в других каталогах импортируют config, пути верны?

\code\ 
    main.py 
    config.py 
    \module_folder1\ 
     script1.1.py 
\data\ 
    data_file1 
    data_file2 

Мой config.py представляет собой набор глобальных переменных, которые задаются пользователем, или вообще фиксированной все время. В частности, config.py определяет переменные пути для двух файлов данных, например path1 = os.path.abspath("../data/data_file1"). Основное назначение - запустить main.py, который импортирует config (и другие модули, которые я написал), и все хорошо.

Но иногда мне нужно запустить script1.1.py сам по себе. Без проблем. Я могу добавить к script1.1 обычный if __name__ == '__main__': и я могу импортировать config. Но тогда я получаю path1 = "../code/data/data_file1", которого не существует. Я думал, что, поскольку путь создан в config.py, путь будет относиться к тому, где живет config.py, но это не так.

Итак, вопрос в том, как я могу получить центральный файл конфигурации, который определяет относительные пути, поэтому я могу импортировать файл конфигурации в сценарии в разных каталогах и иметь пути по-прежнему правильными?

Следует упомянуть, что код repo будет использоваться совместно несколькими машинами, поэтому жестко кодирование абсолютного пути не является вариантом.

+0

Там был комментарий я ответил, но теперь, кажется, исчез. Было предложено использовать 'os.path.dirname (__ file __)' в файле конфигурации (я думаю), это правильно? Это похоже на то решение, которое я ожидал. – travelingbones

ответ

1
  1. Вы знаете правильный относительный путь к файлу из каталога, в котором config.py находится
  2. Вы знаете правильный относительный путь к каталогу, в котором config.py находится (в вашем случае, ..)

Обе эти вещи являются системно-независимыми и не меняются, если вы не измените структуру вашего проекта. Просто добавьте их вместе, используя os.path.join('..', config.path_repative_to_config)

+0

Это будет работать. хорошая идея. Похоже, что должна быть лучшая функция 'os.getcwd()', которая является агностиком для импорта-для-разных-каталогов. – travelingbones

0

(Не уверен, кто разместил это как комментарий, а затем удалил его, но он работает, поэтому я отправляю в качестве ответа.) Фокус в том, чтобы использовать os.path.dirname(__file__) в файле конфигурации, который предоставляет каталог конфигурационного файла (/code/) независимо от того, где скрипт, импортирующий конфигурацию.

В частности, чтобы ответить на этот вопрос, в конфигурационном файле определить

path1 = os.path.abspath(os.path.join(os.path.join(os.path.join(os.path.dirname(__file__) , '..'), 'data'), 'data_file1'))