Como executar scripts Python no Windows?

91

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?

ton4eg
fonte
3
postar um snippet de código pode nos ajudar a ajudá-lo.
jldupont de
Homem sem bola de cristal já deu uma solução =) print sys.argv [1] produz este erro.
ton4eg
Se você tiver várias versões do Python instaladas, pode precisar deste stackoverflow.com/questions/1934675/… .
laike9m
Diga manualmente ao python para executar meu script do registro: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Respostas:

144

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

    C: \> assoc .py
    .py = Python.File

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:

    C: \> ftype Python.File
    Python.File = "c: \ python26 \ python.exe" "% 1"% *

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:

    "c: \ python26 \ python.exe" "blah.py" foo

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

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command

chave para:

"C:\Python26\python26.exe" "%1" %*

Provavelmente, anteriormente, %*estava faltando. Da mesma forma, defina

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

com o mesmo valor. Consulte http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

exemplo de configuração de registro para python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandO caminho do registro pode variar, usar python26.exeou python.exeou o que já estiver no registro.

insira a descrição da imagem aqui HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

Peter Hansen
fonte
30
Mesmo se assoce ftypeexibir 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 a HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandchave como: "C:\Python26\python26.exe" "%1" %* Provavelmente, anteriormente, %*estava faltando. Da mesma forma, defina HKEY_CLASSES_ROOT\py_auto_file\shell\open\commandcom o mesmo valor. Veja eli.thegreenplace.net/2010/12/14/…
parvus
5
@parvus Seu comentário foi a solução definitiva para mim. Mesmo com as associações sendo lidas corretamente, essas duas chaves foram configuradas incorretamente.
Nathan Cox
1
Também tive problemas com HKEY_CLASSES_ROOT \ .py \ OpenWithProgids sendo definido como algo relacionado ao VisualStudio, especificamente quando tento executar scripts Python em meus testes AppVeyor. Consulte help.appveyor.com/discussions/problems/… .
Jack O'Connor
1
Eu tenho um problema semelhante. O Anaconda por padrão adicionou a chave de registro sem% *
prasad
No Win10 eu escrevo test.py 123e sou 123impresso como sys.argv[1]. A Microsoft mudou alguma coisa?
Hrvoje T
22

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

santosc
fonte
16

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 .pye.pyw extensões é que a primeira abre um prompt de comando quando executada, e a última não.

No meu computador, adicionei ;.PY;.PYWcomo 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:

C:\>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\>assoc .py
.py=Python.File

C:\>ftype Python.File
Python.File="C:\Python32\python.exe" "%1" %*

C:\>assoc .pyw
.pyw=Python.NoConFile

C:\>ftype Python.NoConFile
Python.NoConFile="C:\Python32\pythonw.exe" "%1" %*

C:\>type c:\windows\helloworld.py
print("Hello, world!")  # always use a comma for direct address

C:\>helloworld
Hello, world!

C:\>
Dave Burton
fonte
4

Como executar scripts Python no Windows?

Você pode instalar o pylauncher . É usado para iniciar arquivos .py, .pyw, .pyc, .pyo e oferece suporte a várias instalações Python:

T\:> blah.py argument

Você pode executar seu script Python sem especificar a extensão .py se tiver .py, .pyw na variável de ambiente PATHEXT:

T:\> blah argument

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:

T:\> py -3 blah.py argument

Isso também deve corrigir seu sys.argvproblema como um efeito colateral.

jfs
fonte
O Python Launcher está em status beta.
Nicolas Barbulesco
@NicolasBarbulesco: o iniciador Python está incluído no Python 3.3 , ou seja, é bom o suficiente
jfs
Talvez. Mas não consegui instalar o Python 3 no Windows . Talvez você possa me ajudar aqui.
Nicolas Barbulesco
4

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: a test.bate a test-script.py.

test.baté o seguinte (os .batarquivos da Anaconda\Scriptschamada python.execom um caminho relativo que adaptei para os meus propósitos):

@echo off
set PYFILE=%~f0
set PYFILE=%PYFILE:~0,-4%-script.py
"python.exe" "%PYFILE%" %*

test-script.py é o seu script Python real:

import sys
print sys.argv

Se você deixar esses dois arquivos em seu diretório local, poderá invocar seu script Python por meio do .batarquivo, fazendo

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

Se você copiar ambos os arquivos para um local que esteja em seu PATH(como Anaconda\Scripts), você poderá até mesmo invocar seu script, omitindo o .batsufixo

test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

Isenção de responsabilidade: não tenho ideia do que está acontecendo e como isso funciona, então gostaria de receber qualquer explicação.


fonte
Criar um .batwrapper para cada script Python é desajeitado e redundante. Eu não recomendaria isso.
tripleee
2

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.

Aspak Rogatiya
fonte
1

Encontrou uma resposta incrivelmente útil aqui : como executar diferentes versões de python em cmd?

Eu sugeriria usar o utilitário Python Launcher for Windows que foi introduzido no Python 3.3 um tempo atrás. Você também pode baixar manualmente e instalá-lo diretamente do site do autor para uso com versões anteriores do Python 2 e 3.

Independentemente de como você o obteve, após a instalação, ele terá se associado a todas as extensões de arquivo Python padrão (ou seja, arquivos .py, .pyw, .pyc e .pyo). Você não apenas será capaz de controlar explicitamente qual versão é usada no prompt de comando, mas também em uma base de script por script adicionando comentários Linux / Unix-y shebang #! / Usr / bin / env pythonX no início de seus scripts Python.

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.

Novo na versão 3.3.

O lançador Python para Windows é um utilitário que ajuda na localização e execução de diferentes versões do Python. Ele permite que os scripts (ou a linha de comando) indiquem uma preferência por uma versão específica do Python e localizem e executem essa versão.

Esta é uma ótima ferramenta, basta usá-la!

laike9m
fonte
0

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

python C:\Somedir\blah.py

Agora você pode executar blah.py de qualquer lugar, porque você não precisa colocar a extensão .bat ao executar arquivos bat

Luka Rahne
fonte
python em PATH. E o diretório que contém blah.py também em PATH. A ideia principal é executar o script python sem escrever o caminho completo para ele. Mas agora tenho problemas com a passagem de argumentos.
ton4eg
3
Ralu, você não precisa de um arquivo em lote para executar um script Python desta forma. Use a var de ambiente PATHEXT para incluir .py e .pyw como extensões executáveis. Essa var é a razão pela qual você também não precisa especificar .bat.
Todd de
0

Se foi isso que entendi, é assim:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

COPIE (não exclua) python.exe, renomeie para py.exe e execute:

py filename.py
Lucas paz
fonte
0

Basta executar o comando:

C:>python .\file_name.py

Supondo que o nome do arquivo esteja na mesma pasta e o Python já tenha sido adicionado às variáveis ​​de ambiente.

Mwiza
fonte