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

person mckoss    schedule 14.04.2010    source источник
comment
Однако это работает для меня. C:\Documents and Settings\Quim›test foo Аргументы: ['foo'] Я разместил test.py в исходном месте для cmd.exe (%HOMEDRIVE%%HOMEPATH% в свойствах). В остальном ничего особенного в моей настройке нет: winxp, Activepython 2.6.5   -  person joaquin    schedule 15.04.2010
comment
Не могли бы вы использовать RegScanner и найти все вхождения Python.File в свой реестр?   -  person Piotr Dobrogost    schedule 22.10.2011
comment
Вау, какая досадная ошибка :( Я только что переустановил Python, и он все еще не работает! Об ошибке сообщили в системе отслеживания проблем Python два года назад bugs.python.org/issue7936, но исправления нет - мало кто из разработчиков использует Windows.   -  person Colonel Panic    schedule 18.09.2012
comment
Столкнулся с этим, когда установил python 3.4 и попытался использовать python 2.7. Похоже, установщик Python 3.4 все испортил?   -  person Dogmatixed    schedule 21.10.2014
comment
Если система использует [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" %*.   -  person Eryk Sun    schedule 09.06.2016
comment
внутренние команды cmd assoc и ftype отображают и изменяют только HKLM\SOFTWARE\Classes, поэтому им требуется доступ администратора для записи в реестр, и они не являются правильными инструментами для использования, если Python установлен для текущего пользователя. Вы должны использовать regedit для изменения настроек для каждого пользователя в HKCU\SOFTWARE\Classes, которые имеют приоритет над настройками HKLM. Кроме того, связь с ProgId всегда должна управляться через проводник, а не через assoc. Проводник сохраняет выбор пользователя в HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts.   -  person Eryk Sun    schedule 09.06.2016


Ответы (12)


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

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

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

person mckoss    schedule 14.04.2010
comment
У меня это не сработало в Windows 7. В какой ОС вы это тестировали? - person Acorn; 26.05.2010
comment
Мой ключ находится здесь в Windows 7: HKEY_USERS\S-1-5-21-2829634124-923609355-2255922086-1001\Software\Classes\Applications\python.exe\shell\open\command - person Steven Keith; 09.10.2010
comment
Со значением: C:\Python26\python.exe %1 %* - person Steven Keith; 09.10.2010
comment
HKEY_CLASSES_ROOT не лучшее место для проверки того, где хранится данный ключ. См. где в реестре хранится Windows, с помощью какой программы открывать определенные типы файлов? - person Piotr Dobrogost; 22.10.2011
comment
У меня сработало, помните, что ответ mckoss экранирован или это файл .REG, если вы редактируете значения, напрямую удаляя экранирование там - person fedmich; 02.03.2014
comment
У меня также работало под Windows 8. Установщик Python 3.x изначально все делал правильно, но проблема возникла, когда я добавил еще и версию 2.x. - person 5agado; 19.03.2014
comment
Спасибо, кажется, что установка python26 (python-2.6.amd64.msi) плохо настраивает. Он исправлен для меня в вашем реестре с точной следующей строкой: C:\Python26\python.exe %1 %* - person Pedro Reis; 01.04.2014
comment
Обратите внимание, что в зависимости от того, как вы запускаете этот пакетный скрипт, %1 может потребоваться изменить на %%1. - person denfromufa; 30.03.2015
comment
На заметку: основная причина этого может быть связана с начальной ассоциацией файлов с файлами .py до установки Python. Только что столкнулся с этой проблемой, файлы типа .py были связаны с Блокнотом, а затем был установлен Python, и эта уродливая проблема подняла свою уродливую голову. В Windows 10 кстати. - person g4m3c0d3r; 25.05.2016
comment
Недавно изменил пусковую установку на использование C:\Windows\py.exe и обнаружил эту ошибку. Однако я изменил ключ в версии @StevenKeith, заменив py.exe на python.exe. - person Casey Kuball; 22.06.2018

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

person bainorama    schedule 14.10.2010

Для 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", но именно этот я изменил, и он заработал.

person Cody Piersall    schedule 13.04.2013

Вот файлы .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\" %*"
person iki    schedule 02.06.2017

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

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

и добавил %*

person rundekugel    schedule 15.03.2016

Если это исправили в моей системе 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" %*
person stuw    schedule 21.12.2018

Большое спасибо за большинство других ответов, которые помогли мне найти решение!

Мой случай заключался в том, чтобы открывать .py-файлы с помощью py.exe (а не python.exe напрямую), этот случай был отмечен в паре комментариев, но я решил опубликовать это как отдельный ответ, чтобы подчеркнуть разницу.

Итак, у меня есть .py-файлы, связанные с C:\Windows\py.exe, а в конфигурации C:\Windows\py.ini у меня есть пара определений shebang.

[commands]
<my_venv_py> = C:\Programs\my_venv_py\Scripts\python.exe
<my_venv_py_w> = C:\Programs\my_venv_py\Scripts\pythonw.exe

для использования в моих сценариях, подобных этому #!<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\" %*"

person and1er    schedule 29.07.2020

Пришлось изменить это в Windows 10, чтобы заставить его работать (%* в конце)

Компьютер\HKEY_USERS\S-1-5-21-2364940108-955964078-1358188674-1001\Software\Classes\Applications\py.exe\shell\open\command

person Arunex    schedule 12.10.2020

Интересный. Здесь работает с использованием 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
person hughdbrown    schedule 14.04.2010

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

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

person congusbongus    schedule 15.07.2016
comment
Не работал в моей системе, так как по умолчанию всегда вызывался Python 3.6. выбранный ответ сработал. - person Aaron3468; 23.05.2017
comment
Проблемы есть начиная с Windows10, так что это не всегда работает. - person rundekugel; 15.01.2018

Я проверил все ключи реестра с помощью 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\shell\open\command

    • 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\open\command

    • 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" "%*"
  • HKEY_CLASSES_ROOT\Applications\pythonw.exe\shell\open\command

    • org: "C:\Python34\pythonw.exe" "%1"
    • изменено: "C:\Python35\pythonw.exe" "%1" "%*"
  • HKEY_CURRENT_USER\Software\Classes\Applications\python.exe\shell\open\command

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

Но это не помогло мне. Мне также пришлось изменить приложение Python по умолчанию.

Диалоговое окно приложения

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

person MrLeeh    schedule 16.12.2016

Просматривая реестр 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" %*.

person Richard Mateosian    schedule 08.08.2018