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
Хоакін

Не могли б ви використати RegScanner і знайти всі випадки Python.Fileу вашому реєстрі?
Piotr Dobrogost

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 \):

[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
Steven Keith

4
Зі значенням: C: \ Python26 \ python.exe% 1% *
Стівен Кіт

2
Працював для мене, пам’ятайте, що відповідь mckoss вимкнено або файл .REG, якщо ви редагуєте значення, які безпосередньо видаляли
вхідні екрани

3
Примітка: Основна причина цього може бути пов’язана з початковою асоціацією файлів із .py файлами до встановлення Python. Щойно натрапив на цю проблему, файли типу .py були пов’язані з Блокнотом, а потім був встановлений Python, і ця негарна проблема підняла свою потворну голову. В ОС Windows 10 BTW.
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

і додав a %*


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 \:

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

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • Команда HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165 \ Software \ Classes \ py_auto_file \ shell \ open \

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • Команда HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165_Classes \ py_auto_file \ shell \ open \

    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
  • Команда HKEY_CLASSES_ROOT \ Applications \ pythonw.exe \ shell \ open \

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

    • 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-file та запуск). Я знайшов цей "%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 \ команда

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.