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" %*
Python.File
em seu registro?[HKCU|HKLM]\SOFTWARE\Classes\Applications\python.exe
ou[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.File
ProgId padrão . Verifique ashell\open\command
subchave 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" %*
.Respostas:
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).
fonte
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.fonte
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.fonte
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\" %*"
fonte
Para fazê-lo funcionar para mim, tive que usar o caminho do registro:
e adicionou um
%*
fonte
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
fonte
As associações do seu programa para
.py
arquivos podem ser confusas. Apenas reassocie os.py
arquivos ao seu executável Python.Botão direito do mouse um
.py
arquivo>Open with
>Choose default program ...
> [encontrar C: \ PythonXY \ python.exe]fonte
Eu verifiquei todas as chaves de registro com
python.exe
epy_auto_file
e fiz com que apontassem para minha instalação atual do python, incluindo%*
aquela que passa argumentos no final. Eles eram alguns:Mas isso não funcionou para mim. Tive que mudar meu aplicativo python padrão também.
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.
fonte
Olhando o registro do Windows, encontrei todos os lugares onde
Python36\pythonw.exe "%1" %*
aparece algo parecido .Quando digito
python app.py args
no 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" %*
.fonte
Se isso foi corrigido no meu sistema Windows 10, editando as seguintes chaves de registro:
para este valor:
"C:\Python27\python.exe" "%1" %*
fonte
Muito obrigado pela maioria das outras respostas por me ajudar a encontrar a solução!
Meu caso foi abrir
.py
-files compy.exe
(nãopython.exe
diretamente), 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 associadosC:\Windows\py.exe
e naC:\Windows\py.ini
configuração tenho algumas definições completaspara 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
.reg
arquivo 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\" %*"
fonte
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
fonte