Как выполнить файл *.PY из файла *.IPYNB на ноутбуке Jupyter?

Я работаю над Python Notebook, и мне бы хотелось, чтобы большой входной код [input] упаковал в файлы [*.PY] и вызвал эти файлы из ноутбука.

Действие запуска файла [.PY] из Ноутбука известно мне, и команда варьируется между Linux или Windows. Но когда я делаю это действие и выполняю файл [.PY] из ноутбука, он не распознает какую-либо существующую библиотеку или переменную, загруженную в блокнот (она, как файл [.PY], начинается с нуля...).

Есть ли способ исправить это?

Возможным упрощенным примером проблемы может быть следующее:

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

Где " script.py" имеет следующее содержание:

plt.plot(x, f(x))
plt.xlabel("Eje $x$",fontsize=16)
plt.ylabel("$f(x)$",fontsize=16)
plt.title("Funcion $f(x)$")
  • В реальной проблеме файл [*.PY] не имеет 4 строк кода, он имеет достаточно больше.

Ответ 1

В %run магической документации вы можете найти:

-i запустите файл в пространстве имен IPythons вместо пустого. Это полезно, если вы экспериментируете с кодом, написанным в текстовом редакторе, который зависит от переменных, определенных в интерактивном режиме.

Поэтому при поставке -i выполняется трюк:

%run -i 'script.py'

"Правильный" способ сделать это

Может быть, приведенная выше команда - это именно то, что вам нужно, но со всем вниманием, которое получает этот вопрос, я решил добавить еще несколько центов для тех, кто не знает, как будет выглядеть более питонический путь.
Вышеприведенное решение немного взломано и делает код в другом файле запутанным (откуда эта переменная x и что такое функция f?).

Я хотел бы показать вам, как это сделать, не выполняя при этом другой файл снова и снова. Просто превратите его в модуль со своими функциями и классами, а затем импортируйте его из своего ноутбука или консоли Jupyter. Это также имеет преимущество, заключающееся в том, чтобы сделать его легко повторно используемым, а jupyters contextassistant может помочь вам с автозавершением или показать вам docstring, если вы написали один.
Если вы постоянно редактируете другой файл, то autoreload приходит к вам.

Ваш пример будет выглядеть следующим образом:
script.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)$")

Консоль 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:      function

Ответ 2

Может быть, не очень элегантный, но он выполняет свою работу:

exec(open("script.py").read())