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:\Python25\python.exe" "%1" %*
Python.File="C:\Python25\python.exe" "%1" %*
Python.NoConFile="C:\Python25\pythonw.exe" "%1" %*
Ответы
Ответ 1
Думаю, я решил это. По какой-то причине в реестре есть ВТОРОЕ место (кроме того, что показано ассоциациями файлов, хранящимися в HKEY_CLASSES_ROOT\Python.File\shell\open\command):
[HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command]
@="\"C:\\Python25\\python.exe\" \"%1\" %*"
Кажется, это контрольная настройка в моей системе. В приведенном выше разделе реестра добавляется "% *", чтобы передать все аргументы python.exe(по какой-то причине он отсутствовал в моем реестре).
Ответ 2
У меня был еще один раздел реестра HKEY_CLASSES_ROOT\py_auto_file
. Другие упомянутые ключи также существовали, но Windows по какой-то причине использовала это.
Ответ 3
Для 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"
, но это тот, который я изменил, что заставило его работать.
Ответ 4
Чтобы он работал у меня, мне пришлось использовать путь к реестру:
HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
и добавил %*
Ответ 5
Вот. REG файлы для исправления для Python 3.6, 2.7 и Anaconda3:
Python-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\" %*"
Python-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\" %*"
Ответ 6
Интересно. Работает здесь с использованием 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
Ответ 7
Ваши ассоциации программ для файлов .py
могут быть испорчены. Просто повторно ассоциируйте файлы .py
с вашим исполняемым файлом python.
Щелкните правой кнопкой мыши файл .py
> Open with
> Choose default program ...
> [find C:\PythonXY\python.exe]
Ответ 8
Я проверил все разделы реестра с python.exe
и py_auto_file
и сделал их указаными на мою текущую установку python, включая th %*
в конце, которая передает аргументы. Их было немало:
-
HKEY_CLASSES_ROOT\Приложения\python.exe\shell\open\команда:
- org: "C:\miniconda3\python.exe" "% 1" "% *"
- изменено: "C:\Python35\python.exe" "% 1" "% *"
-
HKEY_CLASSES_ROOT\py_auto_file оболочка\открытой\команда\
- org: "C:\Program Files\Sublime Text 3\sublime_text.exe" "% 1"
- изменено: "C:\Python35\python.exe" "% 1" "% *"
-
HKEY_CURRENT_USER\Software\Classes\py_auto_file\Shell\открытая команду \
- org: "C:\Python35\python.exe" "% 1" "% *"
-
HKEY_USERS\S-1-5-21-2621213409-1291422344-4183577876-2165\Software\Classes\py_auto_file\Shell\открытая команду \
- org: "C:\Python35\python.exe" "% 1" "% *"
-
HKEY_USERS\S-1-5-21-2621213409-1291422344-4183577876-2165_Classes\py_auto_file\Shell\открытая команду \
- org: "C:\Python35\python.exe" "% 1" "% *"
-
HKEY_CLASSES_ROOT\Applications\pythonw.exe\Shell\открытая команду \
- org: "C:\Python34\pythonw.exe" "% 1"
- изменено: "C:\Python35\pythonw.exe" "% 1" "% *"
-
HKEY_CURRENT_USER\Software\Classes\Applications\python.exe\Shell\открытая команду \
- org: "C:\Python35\python.exe" "% 1" "% *"
Но это не помогло мне. Я также должен был изменить свое приложение python по умолчанию.
![Диалог приложений]()
Как видно, у меня есть 3 версии Python. Невозможно увидеть, что здесь, поэтому я попробовал все три из них в качестве моего приложения python по умолчанию. В конце концов мне удалось получить мои аргументы script с одним из этих трех.
Ответ 9
Просматривая реестр Windows, я нашел все места, где Python36\pythonw.exe "%1" %*
что-то вроде Python36\pythonw.exe "%1" %*
.
Когда я python app.py args
в командной строке, все работает правильно.
Когда я использую только имя приложения (app.py args
), Windows открывает app.py в Python, но приложение перестает работать, когда оно пытается получить доступ к argv [1], потому что len (argv) равно 1.
Очевидно, Windows знает достаточно, чтобы передать py файл в Python, но я не могу понять, глядя на записи реестра, как она создает команду. Кажется, он использует "%1"
а не "%1" %*
.
Ответ 10
Если это исправлено в моей системе Windows 10, отредактировав следующие ключи реестра:
Computer\HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
Computer\HKEY_CLASSES_ROOT\Python.File\Shell\Open\Command
Computer\HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
к этому значению:
"C:\Python27\python.exe" "%1" %*