Come eseguire un file all'interno dell'interprete Python?


289

Sto cercando di eseguire un file con comandi Python dall'interprete.

EDIT: sto cercando di utilizzare variabili e impostazioni da quel file, non per invocare un processo separato.


2
modulo os, e sto controllando le altre risposte.
Adam Matan,

2
Sistema operativo consigliato; E ho cancellato la risposta quando ho letto EDIT: - /
lightsong

Risposte:


229

Diversi modi.

Dalla conchiglia

python someFile.py

Dall'interno di IDLE, premi F5 .

Se stai digitando in modo interattivo, prova questo: ( solo Python 2 !)

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

Per Python3 , utilizzare:

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

10
pythonnon funziona se si esegue python 3, al suo posto python3viene utilizzato.
pzkpfw,

41
Execfile non esiste più in python3 e exec () non sembra funzionare in qualche modo ... non sono sicuro di cosa sto facendo di sbagliato. potresti aggiornare la risposta?
temporaneo

c'è un modo per fornire stdinda un file come usare <lo script in esecuzione con in execfile().? @ s-lott
bhanu

9
@pzkpfw python può puntare a qualsiasi versione di python. Ho visto ambienti con solo Python v3 dove pythonpunta python3.
StockB

2
@pzkpfw Dipende dall'eseguibile che pythonil sistema trova guardando attraverso le cartelle nella variabile d'ambiente PATH.
Ciao Arrivederci

254

Per Python 2:

>>> execfile('filename.py')

Per Python 3:

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

Vedere la documentazione . Se stai usando Python 3.0, vedi questa domanda .

Vedi la risposta di @ S.Lott per un esempio di come accedi ai globali da nomefile.py dopo averlo eseguito.


Cosa fa il metodo di lettura? Sfortunatamente il sito della documentazione ufficiale non fornisce un chiaro esempio e spiegazione.
Dmitry,

Legge il file e restituisce (per impostazione predefinita) l'intero contenuto in un'unica stringa, vedere ad esempio la pagina w3schools sul file aperto .
Max

Ecco i documenti per open (): docs.python.org/3/library/io.html
codeape,

96

Python 2 + Python 3

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

Questo eseguirà uno script e inserirà tutte le sue variabili globali nell'ambito globale dell'interprete (il comportamento normale nella maggior parte degli ambienti di scripting).

execDocumentazione di Python 3


1
Tu sei il mio eroe! Ho combattuto con alcune cose davvero strane per giorni in cui os.getcwd () ha detto una cosa, ma glob ("*") ha funzionato in un'altra directory ... Grazie! Grazie!
Pallevillesen

C'è un modo per passare un parametro allo script? quanto segue non funziona: exec (apri "setup.py install"). read (), globals ())
ben

1
@ben che non funzionerà perché openlegge direttamente il codice dallo script. Per passare argomenti, guarda questa risposta , ma invece di execfile, ovviamente usa exece opencome mostrato sopra.
Nico,

47

Sorpreso non l'ho ancora visto. È possibile eseguire un file e quindi lasciare l'interprete aperto al termine dell'esecuzione utilizzando l' -iopzione:

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

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18

30

Sto cercando di utilizzare variabili e impostazioni da quel file, per non invocare un processo separato.

Bene, semplicemente importando il file con import filename(meno .py, deve essere nella stessa directory o sul tuo PYTHONPATH) verrà eseguito il file, rendendone disponibili le variabili, le funzioni, le classi, ecc filename.variable. Nello spazio dei nomi.

Quindi, se hai cheddar.pycon la variabile spam e le uova delle funzioni, puoi importarle con import cheddar, accedere alla variabile con cheddar.spamed eseguire la funzione chiamandocheddar.eggs()

Se il codice cheddar.pyè esterno a una funzione, verrà eseguito immediatamente, ma la creazione di applicazioni che eseguono elementi durante l'importazione renderà difficile riutilizzare il codice. Se possibile, metti tutto all'interno di funzioni o classi.


4
Quello non utilizzerà lo spazio dei nomi globale, come richiede la domanda. Usa invecefrom filename import *
Ricardo Cruz il

La domanda non menziona specificamente l'uso di uno spazio dei nomi globale, che potrebbe essere quello che l'OP vuole, ma non è ovvio dalla domanda.
ryanpcmcquen,

13

Dal mio punto di vista, il modo migliore è:

import yourfile

e dopo aver modificato yourfile.py

reload(yourfile)   

o

import imp; 
imp.reload(yourfile) in python3

ma questo renderà la funzione e le classi così: yourfile.function1, yourfile.class1 .....

Se non puoi accettarli, la soluzione finalmente è:

reload(yourfile)
from yourfile import *

9

Non sono un esperto, ma questo è quello che ho notato:

se il tuo codice è mycode.py per esempio, e digiti solo 'import mycode', Python lo eseguirà ma non renderà tutte le tue variabili disponibili all'interprete. Ho scoperto che dovresti digitare effettivamente 'from mycode import *' se vuoi rendere disponibili tutte le variabili all'interprete.


3
Inoltre, dovrebbe essere un commento, non una risposta.
Adam Matan,

9

Basta fare,

from my_file import *

Assicurati di non aggiungere l'estensione .py. Se usi il tuo file .py nella sottodirectory,

from my_dir.my_file import *

Mi sembra il più elegante.
Massimiliano Kraus,

8

Per python3 usare uno xxxx = namedi yourfile.

exec(open('./xxxx.py').read())

8

Per Python 3:

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

Assicurati di essere nella directory corretta prima di eseguire il comando.

Per eseguire un file da una directory diversa, è possibile utilizzare il comando seguente:

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

1

Supponendo che desideri le seguenti funzionalità:

  1. Il file di origine si comporta correttamente nel debugger (il nome del file viene visualizzato nello stack, ecc.)
  2. __name__ == '__main__' è True, quindi gli script si comportano correttamente come script.

La exec(open('foo.py').read())funzione non riuscita 1 La import foostrategia non funziona 2

Per ottenere entrambi, è necessario questo:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.