Eu tenho um script simples blah.py (usando Python 2):
import sys
print sys.argv[1]
Se eu executar meu script por:
python c:/..../blah.py argument
Ele imprime o argumento, mas se eu executar o script por:
blah.py argument
ocorreu um erro:
IndexError ...
Portanto, os argumentos não passam para o script.
python.exe em PATH. Pasta com blah.py também em PATH.
python.exe é o programa padrão para executar arquivos * .py.
Qual é o problema?
Respostas:
Quando você executa um script sem digitar "python" antes, precisa saber duas coisas sobre como o Windows invoca o programa. A primeira é descobrir que tipo de arquivo o Windows pensa que é:
Em seguida, você precisa saber como o Windows está executando as coisas com essa extensão. Está associado ao tipo de arquivo "Python.File", portanto, este comando mostra o que estará fazendo:
Então, na minha máquina, quando eu digitar "blah.py foo", ele executará esse comando exato, sem nenhuma diferença nos resultados do que se eu tivesse digitado tudo sozinho:
Se você digitar a mesma coisa, incluindo as aspas, obterá resultados idênticos a quando você simplesmente digita "blah.py foo". Agora você pode resolver o resto do seu problema sozinho.
(Ou poste informações mais úteis em sua pergunta, como cópias reais recortar e colar do que você vê no console. Observe que as pessoas que fazem esse tipo de coisa têm suas perguntas votadas e recebem pontos de reputação e mais pessoas são susceptíveis de ajudá-los com boas respostas.)
Trazido de comentários:
Mesmo que assoc e ftype exibam as informações corretas, pode acontecer que os argumentos sejam removidos. O que pode ajudar nesse caso é corrigir diretamente as chaves de registro relevantes para Python. Colocou o
chave para:
Provavelmente, anteriormente,
%*
estava faltando. Da mesma forma, definacom o mesmo valor. Consulte http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/
HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command
O caminho do registro pode variar, usarpython26.exe
oupython.exe
ou o que já estiver no registro.HKEY_CLASSES_ROOT\py_auto_file\shell\open\command
fonte
assoc
eftype
exibir as informações corretas, pode acontecer que os argumentos sejam retirados. O que pode ajudar nesse caso é corrigir diretamente as chaves de registro relevantes para Python. Defina aHKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command
chave como:"C:\Python26\python26.exe" "%1" %*
Provavelmente, anteriormente,%*
estava faltando. Da mesma forma, definaHKEY_CLASSES_ROOT\py_auto_file\shell\open\command
com o mesmo valor. Veja eli.thegreenplace.net/2010/12/14/…test.py 123
e sou123
impresso comosys.argv[1]
. A Microsoft mudou alguma coisa?você deve fazer com que o aplicativo padrão para lidar com arquivos Python seja o python.exe.
clique com o botão direito em um arquivo * .py e selecione a caixa de diálogo "Abrir com". Lá, selecione "python.exe" e marque "sempre usar este programa para este tipo de arquivo" (algo parecido).
então seus arquivos python sempre serão executados usando python.exe
fonte
Além disso, se você deseja executar seus scripts python sem digitar
.py
(ou.pyw
) no final do nome do arquivo, é necessário adicionar.PY
(ou.PY;.PYW
) à lista de extensões na variável de ambiente PATHEXT.No Windows 7:
clique com o botão direito em Computador clique com o botão
esquerdo em Propriedades clique com o botão
esquerdo Configurações avançadas do sistema
clique com o botão
esquerdo na guia Avançado clique com o botão esquerdo Variáveis de ambiente ...
em "variáveis do sistema" role para baixo até ver PATHEXT
clique com o botão esquerdo em PATHEXT para destacá-lo à
esquerda- clique em Editar ...
Editar "Valor da variável" para que contenha
;.PY
(a tecla End irá pular para o final)clique com o botão
esquerdo em OK clique com o botão esquerdo em OK
esquerdo em OK clique com o botão esquerdo em OK
Nota # 1: as janelas do prompt de comando não verão a alteração sem serem fechadas e reabertas.
Nota # 2: a diferença entre o
.py
e.pyw
extensões é que a primeira abre um prompt de comando quando executada, e a última não.No meu computador, adicionei
;.PY;.PYW
como as últimas extensões (de menor prioridade), de modo que os valores "antes" e "depois" de PATHEXT foram:antes:
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
depois de
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW
Aqui estão alguns comandos instrutivos:
fonte
Você pode instalar o pylauncher . É usado para iniciar arquivos .py, .pyw, .pyc, .pyo e oferece suporte a várias instalações Python:
Você pode executar seu script Python sem especificar a extensão .py se tiver .py, .pyw na variável de ambiente PATHEXT:
Ele adiciona suporte para shebang (
#!
linha de cabeçalho) para selecionar a versão desejada do Python no Windows se você tiver várias versões instaladas. Você pode usar sintaxe compatível com * nix#! /usr/bin/env python
.Você pode especificar a versão explicitamente, por exemplo, para executar usando a última versão instalada do Python 3:
Isso também deve corrigir seu
sys.argv
problema como um efeito colateral.fonte
Eu encontrei o mesmo problema, mas no contexto da necessidade de empacotar meu código para usuários do Windows (vindo do Linux). Meu pacote contém vários scripts com opções de linha de comando.
Preciso que esses scripts sejam instalados no local apropriado nas máquinas dos usuários do Windows para que eles possam invocá-los na linha de comando. Como o pacote é supostamente amigável, pedir aos usuários que alterem seus registros para executar esses scripts seria impossível.
Eu encontrei uma solução que o pessoal do Continuum usa para scripts Python que vêm com seu pacote Anaconda - verifique seu diretório Anaconda / Scripts para exemplos.
Para um script Python
test
, crie dois arquivos: atest.bat
e atest-script.py
.test.bat
é o seguinte (os.bat
arquivos daAnaconda\Scripts
chamadapython.exe
com um caminho relativo que adaptei para os meus propósitos):test-script.py
é o seu script Python real:Se você deixar esses dois arquivos em seu diretório local, poderá invocar seu script Python por meio do
.bat
arquivo, fazendoSe você copiar ambos os arquivos para um local que esteja em seu
PATH
(comoAnaconda\Scripts
), você poderá até mesmo invocar seu script, omitindo o.bat
sufixoIsenção de responsabilidade: não tenho ideia do que está acontecendo e como isso funciona, então gostaria de receber qualquer explicação.
fonte
.bat
wrapper para cada script Python é desajeitado e redundante. Eu não recomendaria isso.No Windows ,
Para executar um módulo python sem digitar "python" ,
-> Clique com o botão direito em qualquer arquivo python (*. Py)
-> Defina a propriedade abrir com como "python.exe"
-> Marque a opção "sempre usar este programa para este tipo de arquivo"
-> Anexar o caminho de python.exe ao ambiente variável, por exemplo, anexar C: \ Python27 à variável de ambiente PATH.
Para executar um módulo python sem digitar a extensão ".py"
-> Editar a variável de sistema PATHEXT e acrescentar a extensão ".PY" à lista.
fonte
Encontrou uma resposta incrivelmente útil aqui : como executar diferentes versões de python em cmd?
Como sugere JF Sebastian, o Python Launcher para Windows é a melhor escolha padrão para lançar diferentes versões do Python no Windows. Costumava ser uma ferramenta de terceiros, mas agora é oficialmente compatível desde o Python 3.3.
Esta é uma ótima ferramenta, basta usá-la!
fonte
Você pode executar o python.exe de qualquer mapa? Caso contrário, verifique se você tem os valores adequados para python.exe no ambiente PATH
Você está no mesmo diretório que blah.py. Verifique isso emitindo o comando -> editar blah.py e verifique se você pode abrir este arquivo
EDITAR:
Nesse caso, você não pode. ( python arg significa que você chama python.exe com alguns parâmetros que o python assume que é o nome do arquivo do script que você deseja executar)
Você pode criar um arquivo bat com linhas em seu mapa de caminho e executar um arquivo .bat
Exemplo:
Em um dos mapas de caminho, crie blah.py.bat, edite o arquivo e coloque a linha
Agora você pode executar blah.py de qualquer lugar, porque você não precisa colocar a extensão .bat ao executar arquivos bat
fonte
Se foi isso que entendi, é assim:
COPIE (não exclua) python.exe, renomeie para py.exe e execute:
fonte
Basta executar o comando:
Supondo que o nome do arquivo esteja na mesma pasta e o Python já tenha sido adicionado às variáveis de ambiente.
fonte