Como executar um arquivo no interpretador python?

289

Estou tentando executar um arquivo com comandos python de dentro do intérprete.

Edição: Estou tentando usar variáveis ​​e configurações desse arquivo, para não invocar um processo separado.

Adam Matan
fonte
2
OS, e eu estou verificando as outras respostas.
23611 Adam Matan
2
Sugerido os.system; E resposta excluída quando li o EDIT: - /
lightsong

Respostas:

229

Várias formas.

Da casca

python someFile.py

De dentro do IDLE, pressione F5 .

Se você estiver digitando de forma interativa, tente o seguinte: ( somente Python 2 !)

>>> variables= {}
>>> execfile( "someFile.py", variables )
>>> print variables # globals from the someFile module

Para Python3 , use:

>>> exec(open("filename.py").read())
S.Lott
fonte
10
pythonnão funciona se você estiver executando o python 3, python3é usado.
Pzkpfw
41
O executfile não existe mais no python3 e o exec () parece não estar funcionando de alguma forma ... não tenho certeza do que estou fazendo de errado. você pode atualizar a resposta?
temporary_user_name
existe alguma maneira de fornecer stdinde um arquivo como usar <para o script em execução no execfile(). @ s-lott
bhanu
9
O @pzkpfw python pode apontar para qualquer versão do python. Eu vi ambientes com apenas python v3 para onde pythonaponta python3.
StockB
2
@pzkpfw Isso depende do pythonexecutável que o sistema encontra ao examinar as pastas na variável de ambiente PATH.
HelloGoodbye
254

Para Python 2:

>>> execfile('filename.py')

Para Python 3:

>>> exec(open("filename.py").read())
# or
>>> from pathlib import Path
>>> exec(Path("filename.py").read_text())

Veja a documentação . Se você estiver usando o Python 3.0, consulte esta pergunta .

Veja a resposta de @ S.Lott para obter um exemplo de como você acessa globais de filename.py após executá-lo.

codeape
fonte
O que o método read faz? Infelizmente, o site oficial da documentação não fornece um exemplo e explicação claros.
Dmitry
Ele lê o arquivo e retorna (por padrão) todo o conteúdo em uma única sequência, consulte, por exemplo, a página w3schools no arquivo aberto .
Max
Aqui estão os documentos para open (): docs.python.org/3/library/io.html
codeape
96

Python 2 + Python 3

exec(open("./path/to/script.py").read(), globals())

Isso executará um script e colocará todas as suas variáveis ​​globais no escopo global do intérprete (o comportamento normal na maioria dos ambientes de script).

execDocumentação do Python 3

Waylon Flinn
fonte
1
Você é meu herói! Há dias que brigo com coisas realmente estranhas, onde os.getcwd () disse uma coisa, mas glob ("*") trabalhou em outro diretório ... Obrigado! Obrigado!
pallevillesen
Existe uma maneira de passar um parâmetro para o script? o seguinte não funciona: exec (aberto "setup.py install") read (), globals ()).
ben
1
@ ben que não funcionará porque openlê diretamente o código do script. Para passar argumentos, observe esta resposta , mas em vez de execfile, obviamente, use exece opencomo mostrado acima.
Nico
47

Surpreso, ainda não vi isso. Você pode executar um arquivo e deixar o intérprete aberto após o término da execução, usando a -iopção:

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18
Bennett Talpers
fonte
30

Estou tentando usar variáveis ​​e configurações desse arquivo, para não invocar um processo separado.

Bem, simplesmente importar o arquivo com import filename(menos .py, precisa estar no mesmo diretório ou no seu PYTHONPATH) executará o arquivo, disponibilizando suas variáveis, funções, classes, etc. no filename.variableespaço para nome.

Portanto, se você possui cheddar.pya variável spam e a função eggs - você pode importá-la import cheddar, acessar a variável with cheddar.spame executar a função chamandocheddar.eggs()

Se você tiver um código cheddar.pyfora da função, ele será executado imediatamente, mas a criação de aplicativos que executam coisas na importação dificultará a reutilização do código. Se possível, coloque tudo dentro de funções ou classes.

mikl
fonte
4
Isso não usará o espaço de nomes global, conforme a pergunta exige. Use em vez dissofrom filename import *
Ricardo Cruz
A questão não menciona especificamente o uso de um espaço para nome global, que pode ser o que o OP deseja, mas não é óbvio.
ryanpcmcquen
13

Do meu ponto de vista, a melhor maneira é:

import yourfile

e depois de modificar o seu arquivo.py

reload(yourfile)   

ou

import imp; 
imp.reload(yourfile) in python3

mas isso fará com que a função e as classes sejam assim: yourfile.function1, yourfile.class1 .....

Se você não pode aceitá-las, a solução finalmente é:

reload(yourfile)
from yourfile import *
Neo li
fonte
9

Não sou especialista, mas foi o que notei:

se o seu código for mycode.py, por exemplo, e você digitar apenas 'import mycode', o Python o executará, mas não disponibilizará todas as suas variáveis ​​para o intérprete. Descobri que você deve digitar realmente 'from mycode import *' se quiser disponibilizar todas as variáveis ​​para o intérprete.

carlos e orozco
fonte
3
Além disso, deve ser um comentário, não uma resposta.
Adam Matan 10/03
9

Apenas faça,

from my_file import *

Certifique-se de não adicionar a extensão .py. Se o seu arquivo .py no subdiretório usar,

from my_dir.my_file import *
Shital Shah
fonte
Parece o mais elegante para mim.
Massimiliano Kraus
8

Para uso python3 ou com xxxx = namede yourfile.

exec(open('./xxxx.py').read())
AMG
fonte
8

Para Python 3:

>>> exec(open("helloworld.py").read())

Verifique se você está no diretório correto antes de executar o comando.

Para executar um arquivo de um diretório diferente, você pode usar o comando abaixo:

with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
    exec(file.read())
Prashant Gonga
fonte
1

Supondo que você deseje os seguintes recursos:

  1. O arquivo de origem se comporta corretamente no seu depurador (o nome do arquivo é mostrado na pilha, etc.)
  2. __name__ == '__main__' é True para que os scripts se comportem corretamente como scripts.

O exec(open('foo.py').read())recurso de falha 1 A import fooestratégia de falha recurso 2

Para obter os dois, você precisa do seguinte:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
user3667349
fonte