2017-02-10 3 views
10

Я работаю над ноутбуком Python, и мне бы хотелось, чтобы этот большой код ввода [ввод]упакован в файлы [* .PY] и назовите его из записной книжки.Как выполнить * .PY-файл из файла * .IPYNB на ноутбуке Jupyter?

Известно действие запуска [.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 строк кода, он имеет достаточно больше.
+0

Ваш 'x' переменная является локальной для вашего' .ipynb' файла, * не * ваш файл '.py'. Файл '.py' не имеет понятия о' x'. Найдите способ передать это значение между сценариями. Что-то вроде 'from myfile.ipynb import x' (не знаю, можете ли вы сделать этот тип импорта с файлами' .ipynb', но понимаете ли вы, что я имею в виду? – blacksite

+0

Спасибо за ваш ответ. ноутбук не очень сильно закодирован ... – JMSH

ответ

12

В %run magic documentation вы можете найти:

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

Таким образом, поставки -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 
1

Может быть, не очень элегантно, но это делает работу:

exec(open("script.py").read()) 
Смежные вопросы