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" %*
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
.pyfile >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 по умолчанию.
как видно, у меня установлено 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