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" %*
78 голосов | спросил mckoss 15 AMpThu, 15 Apr 2010 00:56:11 +040056Thursday 2010, 00:56:11

10 ответов


0

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

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

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

ответил mckoss 15 AMpThu, 15 Apr 2010 01:28:12 +040028Thursday 2010, 01:28:12
0

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

ответил bainorama 14 +04002010-10-14T22:57:52+04:00312010bEurope/MoscowThu, 14 Oct 2010 22:57:52 +0400 2010, 22:57:52
0

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

ответил Cody Piersall 14 AMpSun, 14 Apr 2013 02:32:02 +040032Sunday 2013, 02:32:02
0

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

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

и добавил %*

ответил rundekugel 15 MarpmTue, 15 Mar 2016 19:36:15 +03002016-03-15T19:36:15+03:0007 2016, 19:36:15
0

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

питон-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\" %*"
ответил iki 2 J0000006Europe/Moscow 2017, 16:09:56
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
ответил hughdbrown 15 AMpThu, 15 Apr 2010 01:15:53 +040015Thursday 2010, 01:15:53
0

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

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

ответил congusbongus 15 J000000Friday16 2016, 09:12:53
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 оболочки \ открытой \ команда \

         
    • 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 \ открытая команду \

         
    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
    •   
  •   
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165 \ Software \ Classes \ py_auto_file \ Shell \ открытая команду \

         
    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
    •   
  •   
  • HKEY_USERS \ S-1-5-21-2621213409-1291422344-4183577876-2165_Classes \ py_auto_file \ Shell \ открытая команду \

         
    • org: "C: \ Python35 \ python.exe" "% 1" "% *"
    •   
  •   
  • HKEY_CLASSES_ROOT \ Applications \ pythonw.exe \ Shell \ открытая команду \

         
    • org: "C: \ Python34 \ pythonw.exe" "% 1"
    •   
    • изменено: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
    •   
  •   
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ Shell \ открытая команду \

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

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

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

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

ответил MrLeeh 16 FriEurope/Moscow2016-12-16T15:38:08+03:00Europe/Moscow12bEurope/MoscowFri, 16 Dec 2016 15:38:08 +0300 2016, 15:38:08
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" %*.

ответил Richard Mateosian 8 PM00000080000003931 2018, 20:29:39
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" %*
ответил stuw 21 FriEurope/Moscow2018-12-21T15:24:59+03:00Europe/Moscow12bEurope/MoscowFri, 21 Dec 2018 15:24:59 +0300 2018, 15:24:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132