Ejecutar un script en Python
Este artículo hablará sobre cómo podemos usar Python para ejecutar otro script de Python.
Ejecutar una secuencia de comandos de Python en Python
Podemos ejecutar un script de Python usando Python con la ayuda de la función exec()
. La función exec()
es una utilidad de Python que permite la ejecución dinámica de código Python tanto en formato de cadena como de byte. Esta función acepta tres argumentos, a saber,
object
: el código Python en formato de cadena o byteglobals
: Es un argumento opcional. Es un diccionario y contiene funciones y variables globales.locals
: es un argumento opcional. Es un diccionario y contiene funciones y variables locales.
Consulte el siguiente código para ver un ejemplo.
file_name = "code.py"
content = open(file_name).read()
exec(content)
El código anterior primero abre un archivo en el directorio de trabajo con el nombre de code.py
, lee su contenido, lo almacena dentro de una variable con el nombre de content
, y luego pasa el contenido leído al exec()
función. El contenido leído es algo de código Python, y el método exec()
ejecutará ese código Python.
Si tenemos algunas variables locales o globales, podemos almacenarlas dentro de los diccionarios y pasarlas al script ejecutable. El script podrá utilizar esas variables y ejecutar el código. Tenga en cuenta que si usamos algunas funciones dentro del script ejecutable que no hemos pasado como variable global, el programa principal arrojará una excepción.
El siguiente código describe lo mismo.
from random import randint
code = "print(randint(1, 6))"
exec(code, {}, {}) # Empty globals and locals
Producción :
Traceback (most recent call last):
File "<string>", line 4, in <module>
File "<string>", line 1, in <module>
NameError: name 'randint' is not defined
Cuando los globals
y locals
no se pasan al exec()
, los requisitos (para ejecutar el script) se manejan automáticamente. Python es lo suficientemente inteligente como para descubrir qué variables o funciones se necesitan para ejecutar el script. Por ejemplo, el siguiente código se ejecutará perfectamente sin ningún error.
from random import randint
code = "print(randint(1, 6))"
exec(code) # No globals or locals passed
Uso de globals
y locals
Podemos crear funciones personalizadas y funciones importadas dentro del script ejecutable pasándolas a la función exec()
a través de globals
. Como se mencionó anteriormente, si no se encuentran estas dependencias, se generarán excepciones.
Consulte el siguiente código. Aquí definiremos una función personalizada e importaremos una función del paquete random
. Entonces ambas funciones se pasarán a la función exec()
envuelta dentro de un diccionario a través del parámetro globals
.
from random import randint
def get_my_age():
return 19
globals = {"randint": randint, "get_my_age": get_my_age}
code = """
print(randint(1, 6))
print(get_my_age())
"""
exec(
code,
globals,
)
Producción :
5 # It can be any number between 1 and 6, both inclusive
19
En este momento, estas funciones se han pasado a través del parámetro globals
. También podemos pasarlos por locals
. Dado que la función exec
no acepta argumentos de palabras clave, tenemos que pasar un diccionario vacío para globals
y el pass out locals
.
from random import randint
def get_my_age():
return 19
locals = {"randint": randint, "get_my_age": get_my_age}
code = """
print(randint(1, 6))
print(get_my_age())
"""
exec(code, {}, locals)
Producción :
2 # It can be any number between 1 and 6, both inclusive
19