¿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.


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())

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.


¿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


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

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.


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 *

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.


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 *

Me parece el más elegante.
Massimiliano Kraus

8

Para python3, use con xxxx = namede yourfile.

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

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())

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.