Подход относительных путей (python)

Мне никогда не приходилось думать о каком-либо распространении программного обеспечения (я использую python для этого проекта), поэтому теперь я не уверен в «лучшем» или наиболее часто используемом подходе к обработке имен файлов. Теперь я использую относительные пути для всех изображений, файлов конфигурации, ... из каталога верхнего уровня с исполняемой программой.

Поэтому, естественно, происходит сбой, когда программа выполняется из другого места. Мой вопрос: можно ли изменить текущий рабочий каталог в начале программы на имя каталога __file__ (он выполняется в подоболочке, поэтому я не вижу в этом проблемы, но я хочу запустить независимый от платформы, поэтому Я не уверен, как Windows справляется с этим), или если это проблема, я могу решить ее с помощью distutils и установки всей программы (я бы предпочел этого не делать). Или есть ли другие (лучшие) способы?

Так что в принципе я могу легко решить проблему, я просто хочу знать, что обычно делать, спасибо за совет.


person dakov    schedule 07.09.2013    source источник


Ответы (2)


Лучше всего использовать абсолютные пути.

Используйте путь __file__, чтобы не изменять каталоги, вместо этого используйте его для расчета базового пути, который будет использоваться для построения абсолютных путей. В модуле верхнего уровня добавьте:

import os.path

BASE = os.path.dirname(os.path.abspath(__file__))

и повторно используйте BASE для построения абсолютных путей:

abspath = os.path.join(BASE, relpath)

Изменение рабочего каталога редко требуется или полезно.

person Martijn Pieters    schedule 07.09.2013

Что ж, __file__ определено для данного модуля, и не все модули имеют это свойство. Согласно документации:

__file__ — это путь к файлу, из которого был загружен модуль, если он был загружен из файла. Атрибут __file__ отсутствует для модулей C, которые статически связаны с интерпретатором; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу общей библиотеки.

Поскольку вы планируете использовать это в своем собственном модуле, у вас не должно возникнуть проблем с Linux, Windows и даже OSX. Конечно, используйте модуль os.path для управления путями.

person ponnu    schedule 07.09.2013