¿Cómo ejecutar un archivo dentro del intérprete de Python?

289

Estoy tratando de ejecutar un archivo con comandos de python desde el intérprete.

EDITAR: estoy tratando de usar variables y configuraciones de ese archivo, no invocar un proceso separado.

Adam Matan
fuente
2
os módulo, y estoy revisando las otras respuestas.
Adam Matan
2
Sistema os sugerido; Y borré la respuesta cuando leí EDITAR: - /
lightsong

Respuestas:

229

Varias formas.

De la cáscara

python someFile.py

Desde adentro IDLE, presiona F5 .

Si está escribiendo interactivamente, intente esto: (¡ Python 2 solo !)

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

Para Python3 , use:

>>> exec(open("filename.py").read())
S.Lott
fuente
10
pythonno funciona si está ejecutando python 3, python3se usa en su lugar.
pzkpfw
41
Execfile ya no existe en python3, y exec () no parece estar funcionando de alguna manera ... no estoy seguro de lo que estoy haciendo mal. podrías actualizar la respuesta?
temporary_user_name
¿Hay alguna manera de proporcionar stdindesde un archivo como usar <el script de ejecución con en execfile().? @ s-lott
bhanu
9
@pzkpfw python puede apuntar a cualquier versión de python. He visto entornos con solo python v3 donde pythonapunta python3.
StockB
2
@pzkpfw Eso depende de qué pythonejecutable encuentre el sistema cuando revise las carpetas en la variable de entorno 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())

Ver la documentación . Si está utilizando Python 3.0, vea esta pregunta .

Consulte la respuesta de @ S.Lott para ver un ejemplo de cómo accede a los globales desde filename.py después de ejecutarlo.

codeape
fuente
¿Qué hace el método de lectura? Lamentablemente, el sitio de documentación oficial no proporciona un ejemplo claro y una explicación.
Dmitry
Lee el archivo y devuelve (de forma predeterminada) todo el contenido en una sola cadena; consulte, por ejemplo, la página w3schools en el archivo abierto .
Max
Aquí están los documentos para open (): docs.python.org/3/library/io.html
codeape
96

Python 2 + Python 3

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

Esto ejecutará un script y pondrá todas sus variables globales en el alcance global del intérprete (el comportamiento normal en la mayoría de los entornos de script).

execDocumentación de Python 3

Waylon Flinn
fuente
1
¡Eres mi héroe! He estado luchando con algunas cosas realmente extrañas durante días donde os.getcwd () dijo una cosa, pero glob ("*") trabajó en otro directorio ... ¡Gracias! ¡Gracias!
pallevillesen
¿Hay alguna manera de pasar un parámetro al script? lo siguiente no funciona: exec (abre "setup.py install"). read (), globals ())
ben
1
@ben que no funcionará porque openlee directamente el código del script. Para pasar argumentos, mire esta respuesta , pero en lugar de execfile, obviamente use execy opencomo se muestra arriba.
Nico
47

Sorprendido no he visto esto todavía. Puede ejecutar un archivo y luego dejar el intérprete abierto después de que finalice la ejecución utilizando la -iopción:

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

def bar(bing):
  return bing*3

--------



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

Estoy tratando de usar variables y configuraciones de ese archivo, no invocar un proceso separado.

Bueno, simplemente importando el archivo con import filename(menos .py, debe estar en el mismo directorio o en su PYTHONPATH) ejecutará el archivo, haciendo que sus variables, funciones, clases, etc. estén disponibles en el filename.variableespacio de nombres.

Entonces, si tiene cheddar.pyla variable spam y la función eggs, puede importarlos con import cheddar, acceder a la variable con cheddar.spamy ejecutar la función llamandocheddar.eggs()

Si tiene un código cheddar.pyque está fuera de una función, se ejecutará de inmediato, pero crear aplicaciones que ejecuten cosas en la importación dificultará la reutilización de su código. Si es posible, ponga todo dentro de las funciones o clases.

mikl
fuente
44
Eso no usará el espacio de nombres global, como lo requiere la pregunta. Usar en su lugarfrom filename import *
Ricardo Cruz
La pregunta no menciona específicamente el uso de un espacio de nombres global, que puede ser lo que quiere el OP, pero no es obvio a partir de la pregunta.
ryanpcmcquen
13

Desde mi punto de vista, la mejor manera es:

import yourfile

y después de modificar yourfile.py

reload(yourfile)   

o

import imp; 
imp.reload(yourfile) in python3

pero esto hará que la función y las clases se vean así: yourfile.function1, yourfile.class1 .....

Si no puede aceptarlos, la solución final es:

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

No soy un experto, pero esto es lo que noté:

si su código es mycode.py por ejemplo, y escribe simplemente 'import mycode', Python lo ejecutará pero no hará que todas sus variables estén disponibles para el intérprete. Descubrí que debería escribir realmente 'from mycode import *' si desea que todas las variables estén disponibles para el intérprete.

carlos e orozco
fuente
3
Además, debería ser un comentario, no una respuesta.
Adam Matan
9

Solo haz,

from my_file import *

Asegúrese de no agregar la extensión .py. Si su archivo .py está en uso de subdirectorio,

from my_dir.my_file import *
Shital Shah
fuente
Me parece el más elegante.
Massimiliano Kraus
8

Para python3, use con xxxx = namede yourfile.

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

Para Python 3:

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

Asegúrese de estar en el directorio correcto antes de ejecutar el comando.

Para ejecutar un archivo desde un directorio diferente, puede usar el siguiente comando:

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

Supongamos que desea las siguientes características:

  1. El archivo fuente se comporta correctamente en su depurador (el nombre del archivo se muestra en la pila, etc.)
  2. __name__ == '__main__' es True, por lo que los scripts se comportan correctamente como scripts.

La exec(open('foo.py').read())función falla 1 La import fooestrategia falla función 2

Para obtener ambos, necesitas esto:

    source = open(filename).read()
    code = compile(source, filename, 'exec')
    exec(code)
usuario3667349
fuente