O Windows não está passando argumentos de linha de comando para programas Python executados a partir do shell

87

Estou tendo problemas para obter argumentos de linha de comando passados ​​para programas Python se tento executá-los diretamente como comandos executáveis ​​de um shell de comando do Windows. Por exemplo, se eu tiver este programa (test.py):

import sys
print "Args: %r" % sys.argv[1:]

E execute:

>test foo
Args: []

em comparação com:

>python test.py foo
Args: ['foo']

Minha configuração tem:

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" %*
mckoss
fonte
No entanto, funciona para mim. C: \ Documents and Settings \ Quim> test foo Args: ['foo'] Eu coloquei test.py na localização inicial de cmd.exe (% HOMEDRIVE %% HOMEPATH% nas propriedades). Quanto ao resto, não há nada de especial na minha configuração: winxp, Activepython 2.6.5
joaquin
Você poderia usar o RegScanner e localizar todas as ocorrências de Python.Fileem seu registro?
Piotr Dobrogost,
2
Uau, que bug frustrante :( Acabei de reinstalar o Python e ainda está quebrado! O bug foi relatado no rastreador de problemas do Python há dois anos, bugs.python.org/issue7936, mas não há conserto - poucos desenvolvedores usam Windows.
Coronel Panic
2
Encontrei isso quando instalei o python 3.4 e tentei usar o python 2.7. Parece que o instalador do python 3.4 bagunçou tudo?
Dogmatixed em
Se o sistema estiver usando [HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exeou [HKCU|HKLM\SOFTWARE\Classes\py_auto_file, ele está configurado incorretamente e as chaves incorretas devem ser excluídas. Em seguida, use o Explorer ("abrir com" ou o aplicativo de configurações de associação de arquivo) para selecionar a entrada "Python" correta que usa o [HKCU|HKLM]\SOFTWARE\Classes\Python.FileProgId padrão . Verifique a shell\open\commandsubchave no regedit. Se o Python 3 estiver instalado, o modelo de comando deve usar o iniciador py. Se o lançador estiver instalado para todos os usuários, o modelo deve ser "C:\Windows\py.exe" "%1" %*.
Eryk Sun

Respostas:

106

Acho que resolvi isso. Por algum motivo, há um SEGUNDO lugar no registro (além daquele mostrado pelas associações de arquivo armazenadas em HKEY_CLASSES_ROOT \ Python.File \ shell \ open \ command):

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

Esta parece ser a configuração de controle em meu sistema. A configuração de registro acima adiciona o "% *" para passar todos os argumentos para python.exe (ele estava faltando em meu registro por algum motivo).

mckoss
fonte
8
Minha chave está localizada aqui no Windows 7: HKEY_USERS \ S-1-5-21-2829634124-923609355-2255922086-1001 \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command
Steven Keith
4
Com o valor: C: \ Python26 \ python.exe% 1% *
Steven Keith
2
Funcionou para mim, lembre-se de que a resposta do mckoss tem escape ou um arquivo .REG se você estiver editando os valores, removeu diretamente os escapes lá
fedmich
3
Em uma observação lateral: a causa raiz disso pode ser devido a uma associação de arquivo inicial com arquivos .py antes da instalação do Python. Acabei de encontrar esse problema, arquivos do tipo .py foram associados ao Bloco de notas e, em seguida, Python foi instalado e este problema feio apareceu sua cabeça feia. No Windows 10 BTW.
g4m3c0d3r
2
Recentemente, alterei o inicializador para usar C: \ Windows \ py.exe e deparei com esse bug. No entanto, eu modifiquei a chave na versão de @ StevenKeith, com "py.exe" substituído por "python.exe"
Casey Kuball
14

Minha configuração estava em outra chave de registro HKEY_CLASSES_ROOT\py_auto_file,. As outras chaves mencionadas também existiam, mas o Windows estava usando esta por algum motivo.

bainorama
fonte
10

Para Python 3.3 no Windows 7, minha configuração estava em outra chave de registro; a chave que mudei para fazer os argumentos serem passados ​​foi

HKEY_USERS\S-1-5-21-3922133726-554333396-2662258059-1000_Classes\py_auto_file\shell\open\command

Foi "C:\Python\Python33\python.exe" "%1". Eu apenas acrescentei %*a ele. O valor da chave é agora "C:\Python\Python33\python.exe" "%1" %*.

Eu tinha várias (pelo menos cinco) outras chaves com o valor "C:\Python\Python33\python.exe" "%1", mas esta é a que eu alterei e fez com que funcionasse.

Cody Piersall
fonte
5

Aqui estão os arquivos .reg para corrigir para Python 3.6, 2.7 e 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 (alterar nome de usuário)

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
fonte
4

Para fazê-lo funcionar para mim, tive que usar o caminho do registro:

HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

e adicionou um %*

rundekugel
fonte
0

Interessante. Funciona aqui usando python 2.6 e 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
fonte
0

As associações do seu programa para .pyarquivos podem ser confusas. Apenas reassocie os .pyarquivos ao seu executável Python.

Botão direito do mouse um .pyarquivo> Open with> Choose default program ...> [encontrar C: \ PythonXY \ python.exe]

congusbongus
fonte
Não funcionou em meu sistema, já que sempre foi padronizado para chamar Python 3.6. A resposta selecionada funcionou
Aaron3468
Existem problemas desde o Windows10, por isso nem sempre funciona.
rundekugel
0

Eu verifiquei todas as chaves de registro com python.exee py_auto_filee fiz com que apontassem para minha instalação atual do python, incluindo %*aquela que passa argumentos no final. Eles eram alguns:

  • HKEY_CLASSES_ROOT \ Applications \ python.exe \ shell \ open \ command:

    • org: "C: \ miniconda3 \ python.exe" "% 1" "% *"
    • alterado: "C: \ Python35 \ python.exe" "% 1" "% *"
  • HKEY_CLASSES_ROOT \ py_auto_file \ shell \ open \ command

    • org: "C: \ Arquivos de programas \ Sublime Text 3 \ sublime_text.exe" "% 1"
    • alterado: "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"
    • alterado: "C: \ Python35 \ pythonw.exe" "% 1" "% *"
  • HKEY_CURRENT_USER \ Software \ Classes \ Applications \ python.exe \ shell \ open \ command

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

Mas isso não funcionou para mim. Tive que mudar meu aplicativo python padrão também.

Diálogo do aplicativo

Como se pode ver, tenho 3 versões do Python instaladas. É impossível ver qual é qual aqui, então tentei todos os três como meu aplicativo Python padrão. Por fim, consegui obter os argumentos do meu script com um desses três.

MrLeeh
fonte
0

Olhando o registro do Windows, encontrei todos os lugares onde Python36\pythonw.exe "%1" %*aparece algo parecido .

Quando digito python app.py argsno prompt de comando, tudo funciona corretamente.

Quando eu uso apenas o nome do aplicativo ( app.py args), o Windows abre app.py em Python, mas o aplicativo falha ao tentar acessar argv [1], porque len (argv) é 1.

Aparentemente, o Windows sabe o suficiente para passar um arquivo py para Python, mas não consigo descobrir, olhando as entradas do registro, como ele constrói o comando. Parece estar usando, em "%1"vez de "%1" %*.

Richard Mateosian
fonte
0

Se isso foi corrigido no meu sistema Windows 10, editando as seguintes chaves de registro:

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

para este valor:

"C:\Python27\python.exe" "%1" %*
stuw
fonte
0

Muito obrigado pela maioria das outras respostas por me ajudar a encontrar a solução!

Meu caso foi abrir .py-files com py.exe(não python.exediretamente), neste caso ele notou em alguns comentários, mas decidi postar isso como uma resposta separada para enfatizar a diferença.

Portanto, tenho meus .py-files associados C:\Windows\py.exee na C:\Windows\py.iniconfiguração tenho algumas definições completas

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

para usar em meus scripts como este #!<MY_VENV_PY>.

E no Microsoft Windows 7 [versão 6.1.7601] meu script python NÃO recebeu argumentos como este

script.py 1 2

mas funcionou bem

py script.py 1 2

As associações de arquivo estavam OK

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

Eu tentei muitas mudanças no registro, mas a última ajuda foi a seguinte mudança (salva em um .regarquivo e executa). Encontrei esta "%1"string de pesquisa de chave de registro com valor inicial "C:\Windows\py.exe" "%1"e adicionei %*no final como outras notas de resposta:

Windows Registry Editor Version 5.00

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

Para obter informações, antes de tentar configurar essas chaves e valores e não ajudar (pelo menos antes do mencionado acima):

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

and1er
fonte
0

Tive que modificar isso no Windows 10 para fazê-lo funcionar (% * no final)

Computer \ HKEY_USERS \ S-1-5-21-2364940108-955964078-1358188674-1001 \ Software \ Classes \ Applications \ py.exe \ shell \ open \ command

Arunex
fonte