2012-04-23 1 views
5

Я знаю, что мой заголовок не описателен, поэтому позвольте мне попытаться объяснить его здесь.Сценарий Python, теряющий аргументы при запуске из PATH на Windows

Обычно я выполняю мой питон скрипт так:

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

Теперь то, что я сделал это добавил папку D:\github\Miscellaneous-Programs\Python в моих окнах path переменных среды. Чем я пытался выполнить мой сценарий, как это:

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, который принимает некоторые аргументы командной строки после добавления сценария в переменную среды.

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

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

Cygwin output

[email protected] ~ 
$ chmod +x check.py 

[email protected] ~ 
$ ./check.py h 
['./check.py', 'h'] 
+2

сделать файл .bat containg 'python full \ path \ to \ check.py' и добавить каталог, содержащий этот .bat, в' Path' (вы можете захотеть поместить 'echo off' в начале .bat – khachik

+0

Я бы предложил изменить заголовок на что-то более подробное, например: «Запуск сценария Python из PATH исключает все, кроме первого аргумента командной строки», так что другие люди, имеющие ту же проблему, найдут его. – mensi

+0

Действительно ли это было 'C: \ Users \ noob> check -h' not' C: \ Users \ noob> check.py -h'? –

ответ

6

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

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

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

see MSDN

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

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

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

python check.py %* 

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

+0

Спасибо, за ответ он работал так, как вам было предложено. Я воспользуюсь вашим ответом, просто ожидая других альтернативных предложений: D. – RanRag

+0

* В Windows нет понятия исполняемых файлов сценариев с интерпретатор, указанный как # !, поэтому то, что вы намереваетесь сделать, не может работать. * В Windows нет понятия shebang, но это не означает, что вы не можете запускать различные скрипты, указав их имена в командной строке. Btw, есть хороший инструмент, который заставляет shebang работать в Windows - [Python Launcher] (https://bitbucket.org/vinay.sajip/pylauncher/). –

+0

'ShellExecute' - это функция WinAPI, используемая системой в процессе выполнения команды типа' script.py -h' и не зная, как система использует эту функцию, вы не можете описать весь процесс. Ваш ответ неправильный. –

4

Ввод папки на 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"), а остальные параметры - те, которые указаны для скрипта (это то, что %*). Я думаю, ваша проблема вызвана отсутствием части %* в соответствующей записи реестра.

+0

Мой вывод для 'regquery':' (По умолчанию) REG_SZ "C: \ Python26 \ python.exe" "% 1"% * '. Так. ему не хватает '% *' – RanRag

+0

Это было очень полезно для меня. – class

+0

У меня не было этой проблемы до недавнего времени, но недавно я установил Python 3.4 на новый компьютер с включенной Python Launcher и теперь благодаря этому ответу обнаружил, что запись в реестре для файлов '.py' (с использованием класса файлов' py_auto_file', по-видимому) была добавлена ​​без '% *' по какой-то причине. – JAB

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