Python compile: ejecutar código Python mediante una función

Para ejecutar directamente líneas individuales de código o un bloque de código y guardar el resultado en una variable, puedes utilizar la función de compilación de Python, que devuelve un objeto de código que puedes ejecutar.

Posibles aplicaciones

Si no quieres ejecutar sentencias de código individuales directamente en Python, sino solo asignarlas a una variable, puedes utilizar la función Python compile. Se utiliza para convertir el código fuente en código objeto y devuelve un objeto que luego puedes ejecutar utilizando Python exec. También puedes pasar un archivo a la función de compilación de Python para extraer el código fuente.

Consejo

¿Utilizas Python como lenguaje de programación para tu proyecto web? Deploy Now de IONOS te ayudará a trabajar de forma aún más eficiente permitiéndote desplegar tus páginas web a través de GitHub en cualquier momento. Gracias a la vista previa en tiempo real puedes ver el estado actual de tu proyecto en directo, en cualquier momento y con solo unos clics.

Sintaxis de Python compile

Se puede llamar a la función de Python compile con hasta seis parámetros diferentes, aunque solo los tres primeros son obligatorios. El resto puede ajustarse como se desee para especificar el comportamiento de la función.

compile(source, filename, mode, flags = 0, dont_inherit = False, optimize = -1)
python

Tener una visión general de los parámetros individuales ayuda a entender la función de compilación.

Parámetro Opcional Descripción
source no Aquí indicas lo que quieres compilar. Suelen ser strings, pero también puedes añadir objetos byte u objetos AST.
filename no En este punto, señala el archivo fuente del objeto que se va a compilar. Si no hay archivo, puedes escribir lo que quieras. El parámetro debe seguir ajustado.
mode no En el parámetro mode, especifica cómo debe realizarse la compilación. Puedes elegir entre los siguientes valores:
  • eval: se evalúan las expresiones individuales.
  • exec: se evalúan los bloques de código.
  • single: se usa con declaraciones individuales e interactivas.
flags Aquí puedes indicar exactamente cómo debe compilarse el código fuente. Sin embargo, para la inmensa mayoría de las aplicaciones, puedes ignorar flag.
dont_inherit Al igual que flag, el parámetro dont_inherit se utiliza para especificar la compilación de tu fuente.
optimize En el parámetro optimize puedes determinar el nivel de optimización de tu proceso de compilación.

Aplicación de la Python compile

Para visualizar cómo funciona Python compile, es útil un ejemplo de código:

codeAsString = 'x = 10\ny = 7\nres = x * y\nprint("result = ", res)'
codeObject = compile(codeAsString, ' ', 'exec')
exec(codeObject)
python

Primero, define la variable llamada codeAsString, en la que se almacena el siguiente código Python simple como Python string:

x = 10
y = 7
res = x * y
print("result = ", res)
python

Que no te confundan las “\n” que aparecen en una cadena codeAsString: se trata del carácter de control que marca un salto de línea. Como ves, puedes simplemente almacenar tu código Python como una cadena en una variable convencional. Sin embargo, para que el código no se interprete simplemente como una cadena, necesitas la función compile. La llamada a la función compile del ejemplo anterior solo utiliza los parámetros necesarios.

Primero, introduce lo que se va a compilar, es decir, tu cadena. A continuación, especifica el archivo fuente de tu cadena. Aunque en teoría puedes utilizar cualquier cadena de tu elección, como esta cadena se definió directamente en el código y no se leyó de un archivo, en este caso basta con especificar la cadena vacía.

El último parámetro vuelve a ser interesante: la cadena codeAsString es un bloque entero de código, como muestra la resolución de la cadena en el segundo ejemplo de código, así que se utiliza el parámetro exec. Recuerda que se trata de una cadena y no olvides las comillas.

El resultado de la función Python compile se asigna a la variable llamada codeObject en el ejemplo de código anterior, que contiene exactamente lo que su nombre indica: un objeto código. Lo especial de un objeto código es que puedes ejecutarlo en cualquier momento con una llamada a la función exec de Python. Esto es exactamente lo que ocurre en la última línea de código, de modo que el programa mostrará “resultado = 70” al final.

Compilar una sola instrucción

Si solo quieres compilar una única sentencia de código, debes ajustar el tercer parámetro al llamar a la función de Python compile. Esto se debe a que el modo eval se utiliza para sentencias individuales. Descubre un ejemplo de este uso:

singleInstruction = 'print("Hello World!")'
codeObject = compile(singleInstruction, ' ', 'eval')
exec(codeObject)
python

En este ejemplo no hay muchos cambios. Se sigue creando un string con código Python. Sin embargo, a diferencia del ejemplo anterior, en este caso el string solo contiene una única instrucción print de Python que requiere el uso del modo eval y se utiliza para evaluar instrucciones individuales.

Si ahora vuelves a ejecutar tu objeto código utilizando la función exec, verás que todo funciona como esperabas. Tu programa mostrará “¡Hola Mundo!” en la pantalla.

Procesar código fuente a partir de fuentes de archivos

En los ejemplos presentados hasta ahora, siempre se ha definido el código fuente que debe procesar la función de Python compile como una cadena del propio programa. Pero ¿y si tienes un archivo que contiene código que quieres ejecutar en tu programa? Para ello también puedes utilizar Python compile.

Supón que tienes un archivo llamado testcode.py que contiene un código Python ejecutable y quieres ejecutarlo en tu programa:

tmpFile = open('testcode.py', 'r')
tmpCode = tmpFile.read()
tmpFile.close()
codeObject = compile(tmpCode, 'testcode.py', 'exec')
exec(codeObject)
python

Primero tienes que leer el código que quieres ejecutar del archivo en el que se encuentra actualmente. Para ello, abre el archivo con la función open de Python y con acceso de lectura. Luego puedes utilizar Python read para leer el código fuente en tu variable llamada tmpCode y cerrar el archivo que abriste al principio.

Ahora sigue la llamada a Python compile. En este punto es importante que indiques de dónde has sacado el código que quieres compilar, en este caso del archivo testcode.py. Nuestro programa se parece entonces a los ejemplos anteriores, y con la llamada final a exec ejecutas finalmente el código de testcode.py en tu programa.