Estoy trabajando en un Python Notebook y me gustaría que el código de entrada grande [input] se empaquete en archivos [* .PY] y llame a estos archivos desde el notebook .
Conozco la acción de ejecutar un archivo [.PY] desde el portátil y el comando varía entre Linux o Windows. Pero cuando realizo esta acción y ejecuto el archivo [.PY] desde el cuaderno, no reconoce ninguna biblioteca o variable existente cargada en el cuaderno (es como si el archivo [ .PY] comenzara desde cero...).
¿Hay alguna forma de arreglar esto?
Un posible ejemplo simplificado del problema sería el siguiente:
In[1]: import numpy as np import matplotlib.pyplot as plt In[2]: def f(x): return np.exp(-x ** 2) In[3]: x = np.linspace(-1, 3, 100) In[4]: %run script.pyDonde " script.py " tiene el siguiente contenido:
plt.plot(x, f(x)) plt.xlabel("Eje $x$",fontsize=16) plt.ylabel("$f(x)$",fontsize=16) plt.title("Funcion $f(x)$")En la documentación de %run magic puedes encontrar:
-ejecuto el archivo en el espacio de nombres de IPython en lugar de uno vacío. Esto es útil si está experimentando con código escrito en un editor de texto que depende de variables definidas de forma interactiva.
Por lo tanto, proporcionar -i hace el truco:
%run -i 'script.py'La forma "correcta" de hacerlo
Tal vez el comando anterior es justo lo que necesita, pero con toda la atención que recibe esta pregunta, decidí agregarle algunos centavos más para aquellos que no saben cómo sería una forma más pitónica.
La solución anterior es un poco complicada y hace que el código en el otro archivo sea confuso (¿De dónde viene esta variable x ? ¿Y cuál es la función f ?).
Me gustaría mostrarle cómo hacerlo sin tener que ejecutar el otro archivo una y otra vez.
Simplemente conviértalo en un módulo con sus propias funciones y clases y luego impórtelo desde su computadora portátil o consola Jupyter. Esto también tiene la ventaja de hacerlo fácilmente reutilizable y el asistente de contexto de jupyters puede ayudarlo con el autocompletado o mostrarle la cadena de documentación si escribió una.
Si está editando constantemente el otro archivo, entonces autoreload viene en su ayuda.
Su ejemplo se vería así:
guión.py
import matplotlib.pyplot as plt def myplot(f, x): """ :param f: function to plot :type f: callable :param x: values for x :type x: list or ndarray Plots the function f(x). """ # yes, you can pass functions around as if # they were ordinary variables (they are) plt.plot(x, f(x)) plt.xlabel("Eje $x$",fontsize=16) plt.ylabel("$f(x)$",fontsize=16) plt.title("Funcion $f(x)$")consola jupyter
In [1]: import numpy as np In [2]: %load_ext autoreload In [3]: %autoreload 1 In [4]: %aimport script In [5]: def f(x): : return np.exp(-x ** 2) : : In [6]: x = np.linspace(-1, 3, 100) In [7]: script.myplot(f, x) In [8]: ?script.myplot Signature: script.myplot(f, x) Docstring: :param f: function to plot :type f: callable :param x: x values :type x: list or ndarray File: [...]\script.py Type: functionlas siguientes líneas también funcionarían
!python script.pyTal vez no sea muy elegante, pero hace el trabajo:
exec(open("script.py").read())