Лучший способ добавить рабочую папку скрипта в путь import () для Python в Windows? - PullRequest
5 голосов
/ 10 февраля 2012

У меня есть программа на Python, которую я компилирую в Windows .exe, используя py2exe.Используя Inno Setup , я создаю установщик Windows.

Природа моей программы такова, что в ней используются плагины, которые впоследствии импортируются с использованием оператора __import__().Эти плагины находятся в папке «плагины», которая сама находится в подпапке, где находится файл .exe моей программы.

Теперь, чтобы программа нашла плагины, она ранее имела следующий оператор где-то в верхней части моего файла:

sys.path+= ['.']

Однако, это не сработало, когда пользователь запустилпрограмма через меню «Пуск» Windows, потому что, видимо, рабочая папка была установлена ​​в меню «Пуск» (вместо того, где находится .exe)Поэтому '.' не удалось разрешить до того, что я хотел.

Я исправил это, изменив оператор следующим образом, чтобы оператор __import__() также смотрел в папке, где находится .exe (потому что argv[0] - это полный путь к исполняемому файлу):

sys.path+= [os.path.dirname(sys.argv[0])]

Однако я не уверен, что выбрал правильное решение.Особенно потому, что моя программа предназначена для кроссплатформенности (Windows, OSX, Linux) и документация sys.argv говорит об argv [0], что «это зависит от операционной системы, является ли это полным путемили нет '.

Должен ли я решить эту проблему по-другому, или мой подход в порядке?

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

Почему бы не иметь файл config с путем к каталогу плагинов? Это позволяет пользователю перемещать его, и вы можете иметь один для каждой ОС. Приклейте его к исполняемому файлу, или, может быть, к паре хорошо используемых мест, ~ или / etc в linux и% homepath% в windows.

3 голосов
/ 10 февраля 2012

В моих программах, скомпилированных в .exe Qt, я использую код, очень похожий на ваш:

def executable_path():
    self_file = unicode(sys.argv[0], sys.getfilesystemencoding())
    return os.path.realpath(os.path.dirname(self_file))

Я использую юникод, потому что путь может содержать символы не ascii.

sys.argv [0] зависит от операционной системы, является ли это полным путем или нет

os.path.realpath решает эту проблему.

1 голос
/ 10 февраля 2012

Я часто использую это:

os.chdir(sys.argv[0].rsplit(os.sep, 1)[0])

, что делает среду выполнения согласованной со средой разработки, в которой вы запускаете скрипт из его каталога.

0 голосов
/ 10 февраля 2012

Пожалуйста, используйте __file__ модуля.Вы можете написать как

sys.path+=os.path.dirname(mymodule.__file__)

Это добавит родительский каталог вашего модуля в sys.path.

...