74

У меня возникли проблемы с получением аргументов командной строки, переданных в программы Python, если я попытаюсь выполнить их непосредственно в качестве исполняемых команд из командной оболочки Windows. Например, если у меня есть эта программа (test.py):Windows не передает аргументы командной строки программам Python, выполненным из оболочки

import sys 
print "Args: %r" % sys.argv[1:] 

И выполнить:

>test foo 
Args: [] 

по сравнению с:

>python test.py foo 
Args: ['foo'] 

Моя конфигурация имеет:

PATH=...;C:\python25;... 
PATHEXT=...;.PY;.... 

>assoc .py 
.py=Python.File 

>ftype | grep Python 
Python.CompiledFile="C:\Python25\python.exe" "%1" %* 
Python.File="C:\Python25\python.exe" "%1" %* 
Python.NoConFile="C:\Python25\pythonw.exe" "%1" %* 
+0

Однако это работает для меня. C: \ Documents и Settings \ Quim> тест Foo Args: [ 'Foo'] I расположен test.py в исходном местоположении для cmd.exe (% HOMEDRIVE %% HOMEPATH% в свойствах). Для остальных нет ничего особенного в моей настройке: winxp, Activepython 2.6.5 – joaquin

+0

Не могли бы вы использовать [RegScanner] (http://www.nirsoft.net/utils/regscanner.html) и найти все вхождения 'Python .Филь в вашем реестре? –

+2

Ничего себе, какая расстраивающая ошибка :(Я просто переустановил Python, и он все еще сломан! Ошибка была обнаружена в трекер-проблеме Python два года назад http://bugs.python.org/issue7936, но нет никаких исправлений - мало кто из разработчиков использует Windows. –

ответ

83

Думаю, я решил это. По какой-то причине есть ВТОРОЕ место в реестре (кроме того, что показано ассоциации файлов, хранящихся в HKEY_CLASSES_ROOT \ Python.File \ оболочки \ открытым \ команде):

[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command] 
@="\"C:\\Python25\\python.exe\" \"%1\" %*" 

Это, кажется, контролирующей установкой на мой система. В приведенном выше разделе реестра добавляется «% *», чтобы передать все аргументы python.exe (по какой-то причине он отсутствовал в моем реестре).

+0

Это не сработало для меня в Windows 7. В какой ОС вы тестировали это? – Acorn

+0

Протестировано на Vista. – mckoss

+6

Мой ключ находится здесь, в Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command –

1

Интересно. Работает здесь с использованием python 2.6 и Windows XP (5.1.2600):

C:\Documents and Settings\hbrown>python test.py foo 
['test.py', 'foo'] 

C:\Documents and Settings\hbrown>test.py foo 
['C:\\Documents and Settings\\hbrown\\test.py', 'foo'] 

C:\Documents and Settings\hbrown>test foo 
['C:\\Documents and Settings\\hbrown\\test.py', 'foo'] 

C:\Documents and Settings\hbrown>type test.py 
import sys 
print sys.argv 

C:\Documents and Settings\hbrown>echo %PATHEXT% 
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PY 

C:\Documents and Settings\hbrown>assoc .py 
.py=Python.File 
13

У меня был параметр еще один раздел реестра, HKEY_CLASSES_ROOT\py_auto_file. Другие упомянутые ключи также существовали, но Windows почему-то использовала это.

+0

Мне тоже! Спасибо! –

8

Для Python 3.3 в Windows 7 мой параметр находился под другим ключом реестра; ключ я изменил, чтобы аргументы получить переданные был

HKEY_USERS\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\py_auto_file\shell\open\command

Это было "C:\Python\Python33\python.exe" "%1". Я только добавил %* к нему. Значение ключа теперь "C:\Python\Python33\python.exe" "%1" %*.

У меня было несколько (не менее пяти) других ключей со значением "C:\Python\Python33\python.exe" "%1", но это я изменил, что заставило его работать.

2

Чтобы сделать это работает для меня, я должен был использовать путь реестра:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command 

и добавил %*

0

Ваша программа объединения для .py файлов может быть перепутано. Просто повторно присоедините файлы .py с исполняемым файлом python.

Щелкните правой кнопкой мыши файл .py>Open with>Choose default program ...> [найти C: \ PythonXY \ python.exe]

+0

Не работал в моей системе, так как он всегда по умолчанию вызывал вызов Python 3.6. [Selected answer] (https://stackoverflow.com/a/2641185/5991423) действительно работал – Aaron3468

+0

Есть проблемы с Windows10, поэтому это не работает всегда. – rundekugel

0

Я проверил все ключи реестра с python.exe и py_auto_file и сделал их указывают на моей текущей установки питона включая й %* в конце, который передает аргументы.Они были довольно мало:

  • HKEY_CLASSES_ROOT \ Applications \ python.exe \ Shell \ открытый \ команду:

    • ORG: "C: \ miniconda3 \ python.exe" «% 1 " "% *"
    • изменилось: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ py_auto_file \ Shell \ открытый команду \

    • орг: "C: \ Program Files \ Sublime Text 3 \ sublime_text.exe" "% 1"
    • изменилось: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ py_auto_file \ оболочки \ Open \ Command

    • орг: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165 \ Software \ Classes \ py_auto_file \ оболочки \ Open \ Command

    • орг: "C: \ Python35 \ python.exe" «% 1" "% *"
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165_Classes \ py_auto_file \ оболочки \ Open \ Command

    • ORG: «C: \ Python35 \ python.exe ""% 1 ""% * "
  • HKEY_CLASSES_ROOT \ Приложения \ pythonw.exe \ оболочки \ Open \ Command

    • орг: "C: \ Python34 \ pythonw.exe" "% 1"
    • изменилось: «C: \ Python35 \ pythonw .exe " "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ оболочки \ Open \ Command

    • орг:" C: \ Python35 \ питон .exe ""% 1 ""% * "

Но это не делать эту работу для меня. Я также должен был изменить свое приложение python по умолчанию.

Application dialog

Как можно видеть, у меня есть 3 версии Python установлен. Невозможно увидеть, что здесь, поэтому я попробовал все три из них в качестве моего приложения python по умолчанию. В конце концов я смог получить аргументы своего сценария с одним из этих трех.

1

Вот .reg файлы, чтобы исправить для Python 3.6, 2.7 и Anaconda3:

питон-3.6.0.reg

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\.py] 
@="Python.File" 
"Content Type"="text/plain" 

[HKEY_CLASSES_ROOT\.pyc] 
@="Python.CompiledFile" 
"Content Type"="text/plain" 

[HKEY_CLASSES_ROOT\.pyw] 
@="Python.NoConFile" 
"Content Type"="text/plain" 


[HKEY_CLASSES_ROOT\py_auto_file] 

[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon] 
@="C:\\Python36\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command] 
@="\"C:\\Python36\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.File] 
@="Python File" 

[HKEY_CLASSES_ROOT\Python.File\DefaultIcon] 
@="C:\\Python36\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\Python.File\shell\open\command] 
@="\"C:\\Python36\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.CompiledFile] 
@="Compiled Python File" 

[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon] 
@="C:\\Python36\\DLLs\\pyc.ico" 

[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command] 
@="\"C:\\Python36\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.NoConFile] 
@="Python File (no console)" 

[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon] 
@="C:\\Python36\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command] 
@="\"C:\\Python36\\python.exe\" \"%1\" %*" 

питон-2.7.0.reg

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\.py] 
@="Python.File" 
"Content Type"="text/plain" 

[HKEY_CLASSES_ROOT\.pyc] 
@="Python.CompiledFile" 
"Content Type"="text/plain" 

[HKEY_CLASSES_ROOT\.pyw] 
@="Python.NoConFile" 
"Content Type"="text/plain" 


[HKEY_CLASSES_ROOT\py_auto_file] 

[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon] 
@="C:\\Python27\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command] 
@="\"C:\\Python27\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.File] 
@="Python File" 

[HKEY_CLASSES_ROOT\Python.File\DefaultIcon] 
@="C:\\Python27\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\Python.File\shell\open\command] 
@="\"C:\\Python27\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.CompiledFile] 
@="Compiled Python File" 

[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon] 
@="C:\\Python27\\DLLs\\pyc.ico" 

[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command] 
@="\"C:\\Python27\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.NoConFile] 
@="Python File (no console)" 

[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon] 
@="C:\\Python27\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command] 
@="\"C:\\Python27\\python.exe\" \"%1\" %*" 

ananconda3.reg (изменить имя пользователя)

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\.py] 
@="Python.File" 
"Content Type"="text/plain" 

[HKEY_CLASSES_ROOT\.pyc] 
@="Python.CompiledFile" 
"Content Type"="text/plain" 

[HKEY_CLASSES_ROOT\.pyw] 
@="Python.NoConFile" 
"Content Type"="text/plain" 


[HKEY_CLASSES_ROOT\py_auto_file] 

[HKEY_CLASSES_ROOT\py_auto_file\DefaultIcon] 
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\py_auto_file\shell\open\command] 
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.File] 
@="Python File" 

[HKEY_CLASSES_ROOT\Python.File\DefaultIcon] 
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\Python.File\shell\open\command] 
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.CompiledFile] 
@="Compiled Python File" 

[HKEY_CLASSES_ROOT\Python.CompiledFile\DefaultIcon] 
@="C:\\Users\\username\\Anaconda3\\DLLs\\pyc.ico" 

[HKEY_CLASSES_ROOT\Python.CompiledFile\shell\open\command] 
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*" 


[HKEY_CLASSES_ROOT\Python.NoConFile] 
@="Python File (no console)" 

[HKEY_CLASSES_ROOT\Python.NoConFile\DefaultIcon] 
@="C:\\Users\\username\\Anaconda3\\DLLs\\py.ico" 

[HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command] 
@="\"C:\\Users\\username\\Anaconda3\\python.exe\" \"%1\" %*"