Сценарий 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']
- Как удалить любое приложение с помощью python или (и) ruby
- Активация окна Python
- Уведомление с использованием python
- Как создать глобальную горячую клавишу alt + в Python?
- В Windows, как конвертировать временные метки до 1970 года в нечто управляемое?
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"
), а остальные параметры являются значениями, указанными в скрипт (это то, что означает %*
). Я думаю, ваша проблема вызвана отсутствием части %*
в соответствующей записи в реестре.
- psycopg2: курсор уже закрыт
- Прочтите файл csv со многими именованными метками столбцов с помощью pandas
- Как я могу получить окно, ориентированное на Windows, и изменить его размер?
- Использование multiprocessing.Pool в классе в Windows с IPython Notebook
- Управление установками Python
- Установить атрибут «скрыть» на папки в ОС Windows?
- Python получает неправильное значение для os.environ на 64-битной версии
- Есть ли способ переместить окно на другой монитор с помощью Python?
- Вызов java-кода из python на окнах 8
- Как заставить Windows знать о службе, которую я написал на Python?
- Многопроцессорство запускает слишком много экземпляров Python VM