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


87

У меня возникают проблемы с передачей аргументов командной строки программам 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" %*

Однако у меня это работает. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Я поместил test.py в исходное расположение для cmd.exe (% HOMEDRIVE %% HOMEPATH% в свойствах). В остальном в моей настройке нет ничего особенного: winxp, Activepython 2.6.5
joaquin

Не могли бы вы использовать RegScanner и найти все вхождения Python.Fileв ваш реестр?
Петр Доброгост

2
Вау, какая неприятная ошибка: (Я только что переустановил Python, а он все еще сломан! Об ошибке было сообщено в системе отслеживания проблем Python два года назад bugs.python.org/issue7936, но исправления нет - немногие разработчики используют Windows.
Полковник Паник

2
Попался в это, когда я установил python 3.4 и попытался использовать python 2.7. Похоже, что установщик python 3.4 все испортил?
Dogmatixed

Если в системе используется [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeили [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, значит, она неправильно сконфигурирована, и соответствующие ключи следует удалить. Затем используйте проводник («открыть с помощью» или приложение настройки ассоциации файлов), чтобы выбрать правильную запись «Python», которая использует стандартный [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId. Проверьте shell\open\commandподключ в regedit. Если установлен Python 3, шаблон команды должен использовать средство запуска py. Если лаунчер установлен у всех пользователей, то шаблон должен быть "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Ответы:


106

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

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

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


8
Мой ключ находится здесь, в Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Стивен Кейт,

4
Со значением: C: \ Python26 \ python.exe% 1% *
Стивен Кейт

2
Сработал для меня, помните, что ответ mckoss экранирован или файл .REG, если вы редактируете значения, напрямую удалили
escape-последовательности

3
На заметку: основная причина этого может быть связана с первоначальной ассоциацией файла с файлами .py до установки Python. Только что столкнулся с этой проблемой, файлы типа .py были связаны с Блокнотом, а затем был установлен Python, и эта уродливая проблема подняла свою уродливую голову. В Windows 10, кстати.
g4m3c0d3r

2
Недавно изменил программу запуска, чтобы использовать C: \ Windows \ py.exe, и столкнулся с этой ошибкой. Однако я изменил ключ в версии @ StevenKeith, заменив «py.exe» на «python.exe»
Кейси Кубалл

14

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


10

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


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

4

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

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

и добавил %*


0

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

0

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

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


Не работал в моей системе, так как всегда по умолчанию вызывал Python 3.6. Выбранный ответ сделал работу
Aaron3468

Проблемы возникают с Windows10, так что это не всегда работает.
rundekugel

0

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

    • 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 по умолчанию. В конце концов я смог получить аргументы сценария с одним из этих трех.


0

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


0

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

0

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

Мой случай состоял в том, чтобы открыть .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\" %*"


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.