У меня возникают проблемы с передачей аргументов командной строки программам 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" %*
Python.File
в ваш реестр?[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exe
или[HKCU|HKLM\SOFTWARE\Classes\py_auto_file
, значит, она неправильно сконфигурирована, и соответствующие ключи следует удалить. Затем используйте проводник («открыть с помощью» или приложение настройки ассоциации файлов), чтобы выбрать правильную запись «Python», которая использует стандартный[HKCU|HKLM]\SOFTWARE\Classes\Python.File
ProgId. Проверьтеshell\open\command
подключ в regedit. Если установлен Python 3, шаблон команды должен использовать средство запуска py. Если лаунчер установлен у всех пользователей, то шаблон должен быть"C:\Windows\py.exe" "%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 (по какой-то причине он отсутствовал в моем реестре).
источник
Моя настройка находилась в еще одном разделе реестра
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"
, но это тот, который я изменил, и он заработал.источник
Вот файлы .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\" %*"
источник
Чтобы он работал у меня, мне пришлось использовать путь в реестре:
и добавил
%*
источник
Интересно. Здесь работает с использованием 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
источник
Ваши программные ассоциации для
.py
файлов могут быть испорчены. Просто повторно свяжите.py
файлы с исполняемым файлом python.Щелкните правой кнопкой мыши
.py
файл>Open with
>Choose default program ...
> [найти C: \ PythonXY \ python.exe]источник
Я проверил все ключи реестра с помощью
python.exe
иpy_auto_file
и заставил их указывать на мою текущую установку python, включая th%*
в конце, который передает аргументы. Их было довольно много:Но это не помогло мне. Мне также пришлось изменить приложение Python по умолчанию.
Как видите, у меня установлено 3 версии Python. Невозможно увидеть, что именно здесь, поэтому я попробовал все три в качестве приложения Python по умолчанию. В конце концов я смог получить аргументы сценария с одним из этих трех.
источник
Просматривая реестр Windows, я нашел все места, где
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" %*
.источник
Если это исправлено в моей системе Windows 10, отредактировав следующие разделы реестра:
к этому значению:
"C:\Python27\python.exe" "%1" %*
источник
Большое спасибо за большинство других ответов, которые помогли мне найти решение!
Мой случай состоял в том, чтобы открыть
.py
файлы с помощьюpy.exe
(неpython.exe
напрямую), этот случай был отмечен в нескольких комментариях, но я решил опубликовать это как отдельный ответ, чтобы подчеркнуть разницу.Итак, у меня есть мои
.py
файлы, связанные с конфигурацией,C:\Windows\py.exe
и уC:\Windows\py.ini
меня есть пара определений shebangиспользовать в моих сценариях вот так
#!<MY_VENV_PY>
.А в Microsoft Windows 7 [версия 6.1.7601] мой скрипт python НЕ получал такие аргументы
script.py 1 2
но это сработало нормально
py script.py 1 2
Файловые ассоциации были в порядке
> assoc .py .py=Python.File > ftype | grep Python File STDIN: Python.CompiledFile="C:\Windows\py.exe" "%1" %* Python.File=C:\Windows\py.exe "%L" %* Python.NoConFile="C:\Windows\pyw.exe" "%1" %*
Я пробовал вносить много изменений в реестр, но последним помогло следующее изменение (сохранить в
.reg
файл и запустить). Я нашел эту"%1"
строку поиска ключа реестра с начальным значением"C:\Windows\py.exe" "%1"
и добавил%*
в конце, как примечание других ответов:Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Applications\py.exe\shell\open\command] @="\"C:\\Windows\\py.exe\" \"%1\" %*"
Для информации, прежде чем я попытался настроить эти ключи и значения и не помог (по крайней мере, до указанного выше):
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.py] @="Python.File" [HKEY_CURRENT_USER\Software\Classes\.py] @="Python.File" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py] @="Python.File" [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py] @="Python.File" [HKEY_CLASSES_ROOT\py_auto_file] @="Python File" [HKEY_CLASSES_ROOT\py_auto_file\shell\open\command] @="\"C:\\Windows\\py.exe\" \"%1\" %*" [HKEY_CLASSES_ROOT\Python.File] @="Python File" [HKEY_CLASSES_ROOT\Python.File\Shell\Open\command] @="\"C:\\Windows\\py.exe\" \"%1\" %*"
источник
Пришлось изменить это в Windows 10, чтобы заставить его работать (% * в конце)
Компьютер \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command
источник