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



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



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:Python25python.exe" "%1" %*
Python.File="C:Python25python.exe" "%1" %*
Python.NoConFile="C:Python25pythonw.exe" "%1" %*
645   9  

9 ответов:

Я думаю, что я решил эту проблему. По какой-то причине в реестре есть второе место (кроме того, что показано ассоциациями файлов, хранящимися в файле HKEY_CLASSES_ROOT\Python.File\shell\open\command):

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

это похоже на настройку управления в моей системе. Параметр реестра выше добавляет "% * " для передачи всех аргументов python.exe (по какой-то причине он отсутствовал в моем реестре).

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

для 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", но это тот, который я изменил, что заставило его работать.

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

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

и добавил a %*

интересные. Работает здесь с помощью 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

здесь .reg файлы для исправления для Python 3.6, 2.7 и Anaconda3:

python-3.6.0.Рег

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\" %*"

python-2.7.0.Рег

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.Рег (изменить логин)

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\" %*"

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

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

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

  • HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command:

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

    • org: "C:\Program файлы\Sublime Text 3\sublime_text.exe ""%1"
    • изменен: "C:\Python35\python.exe" "%1" "%*"
  • раздел HKEY_CURRENT_USER классы программного обеспечения\\\py_auto_file\Шелл\открыть\команду

    • org: "C:\Python35\python.exe" "%1" "%*"
  • HKEY_USERS\S-1-5-21-2621213409-1291422344-4183577876-2165\Software\Classes\py_auto_file\shell\open\command

    • org: "C:\Python35\python.exe" "%1" "%*"
  • HKEY_USERS\S-1-5-21-2621213409-1291422344-4183577876-2165_Classes\py_auto_file\shell\open\command

    • org: "C:\Python35\python.exe" "%1" "%*"
  • 【\Applications\pythonw.exe\shell\open\command

    • org: "C:\Python34\pythonw.exe ""%1"
    • изменен: "C:\Python35\pythonw.exe" "%1" "%*"
  • раздел реестра HKEY_CURRENT_USER\программное обеспечение\классы\приложения\питона.exe\shell\open\command

    • org: "C:\Python35\python.exe" "%1" "%*"

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

Application dialog

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

просматривая реестр Windows, я нашел все места, где что-нибудь вроде Python36\pythonw.exe "%1" %* появляется.

когда я типа python app.py args в командной строке, все работает правильно.

когда я использую только имя приложения (app.py args) окна открываются app.py в Python, но приложение не работает, когда оно пытается получить доступ к argv[1], потому что len(argv) равен 1.

по-видимому, Windows знает достаточно, чтобы передать файл py в Python, но я не могу понять, глядя на записи реестра как он строит команду. Кажется, он использует "%1", а не "%1" %*.

Comments

    Ничего не найдено.