Сценарий Python потеряет аргументы при запуске из PATH в Windows

Я знаю, что мой титул не описательный, поэтому позвольте мне попытаться объяснить его здесь.

Обычно я выполняю свой скрипт python следующим образом:

D:\github\Miscellaneous-Programs\Python>python check.py -h hello ['check.py', '-h'] 

Теперь, что я сделал, добавлена ​​папка D:\github\Miscellaneous-Programs\Python в моей переменной окружения Windows. Чем я пытался выполнить свой скрипт следующим образом:

 C:\Users\noob>check -h hello ['D:\\github\\Miscellaneous-Programs\\Python\\check.py'] 

Как вы видите, он не показал аргумент -h я ему предоставил.

Мой check.py

 import sys print "hello" print sys.argv 

Если я удалю print sys.argv из вышеупомянутого скрипта python, он отлично работает в обоих случаях, о которых я говорил выше, т. print sys.argv Он отлично печатает «привет».

Итак, мой вопрос заключается в том, как выполнить сценарий python, который принимает некоторые аргументы командной строки после добавления сценария в переменную среды.

Моя цель – выполнить мой python script из любой точки командной строки Windows, которая несколько похожа на chmod +x check.py .

Я попробовал параметр chmod в cygwin, он отлично работает для обоих случаев.

Cygwin output

 noob@noob-PC ~ $ chmod +x check.py noob@noob-PC ~ $ ./check.py h ['./check.py', 'h'] 

Windows не имеет понятия исполняемых файлов сценариев с интерпретатором, указанным как #! , поэтому то, что вы намереваетесь сделать, не может работать. То, что делает Windows, – это вызов функции WinAPI ShellExecute которая выполняет следующие действия:

Однако он чаще используется для запуска приложения, которое работает с определенным файлом. Например, файлы .txt могут быть открыты Microsoft WordPad. Таким образом, открытый глагол для .txt-файла будет соответствовать следующей команде:

 "C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1" 

см. MSDN

Как вы можете видеть, в приложение предоставляется только первый параметр. В вашем случае это означает нечто вроде:

 "C:\Program Files\Python\Python.exe" "D:\github\Miscellaneous-Programs\Python\check.py" 

Что вы можете сделать, чтобы избежать этого, так это создать небольшой .bat файл с именем check.bat :

 python check.py %* 

(См. Этот вопрос SO для более подробной информации. Возможно, вам также понадобится предоставить абсолютный путь для check.py или python, если они не могут быть найдены)

Включение папки в PATH не влияет на то, как система работает при запуске какого-либо скрипта, написав script.py -h в командной строке. Случается, что система считывает реестр, чтобы узнать, как выполнить команду, которую вы дали. Вы можете отобразить эту информацию, выполнив сначала reg query HKCR\.py /ve а затем результат (обычно это Python.File ) и выполнив reg query HKCR\Python.File\shell\open\command /ve . Результатом моей системы является "C:\Program Files\Python Launcher (64-bit)\py.exe" "%1" %* . Это означает, что тогда, когда система видит script.py -h она запускает программу py.exe с первым параметром, являющимся именем скрипта (это означает "%1" ), а остальные параметры являются значениями, указанными в скрипт (это то, что означает %* ). Я думаю, ваша проблема вызвана отсутствием части %* в соответствующей записи в реестре.