2013-09-07 2 views
0

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

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

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

ответ

2

Лучшая практика заключается в использовании абсолютных путей.

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

import os.path 

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

и повторно BASE строить абсолютные пути:

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

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

1

Нуль __file__ определен для данного модуля, и не все модули обладают этим свойством. Согласно documentation:

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

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

Смежные вопросы