2017-02-10 58 views
10

我正在Python筆記本上工作,我想大輸入代碼[輸入]打包成[* .PY]文件並從筆記本調用此文件。如何從Jupyter筆記本上的* .IPYNB文件執行* .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行代碼,它有足夠多。
+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' 

「正確」 的方式做到這一點

也許上面的命令是你需要的東西,但隨着所有這些問題都得到了關注,我決定爲那些不知道更多pythonic方式如何的人增加幾分錢。
上面的解決方案有點不方便,並且使其他文件中的代碼混淆(此x變量來自哪裏?以及什麼是f函數?)。

我想告訴你如何做到這一點,而不必一次又一次地執行其他文件。
只需將它變成一個具有自己的功能和類的模塊,然後從Jupyter筆記本或控制檯導入它。這也具有使其易於重複使用的優點,jupyters contextassistant可以幫助您自動完成或向您顯示文檔字符串,如果您寫了一個。
如果您經常編輯其他文件,那麼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()) 
相關問題