2017-02-10 13 views
10

私はPythonノートブックで作業しています。大きな入力コード[入力]を[* .PY]ファイルにパックして、このファイルをノートから呼び出してください。Jupyterノートブックの* .IPYNBファイルから* .PYファイルを実行するには?

ノートブックから[.PY]ファイルを実行する動作はわかっており、コマンドはLinuxまたはWindowsによって異なります。 しかし、私がこのアクションを実行してノートブックから[.PY]ファイルを実行すると、ノートブックにロードされている既存のライブラリや変数は認識されません( .PY]ファイルは0から始まります)

これを修正する方法はありますか?問題の

可能性単純化した例では、次のようになります:

" script.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 

:本当の問題で

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'について全く知らない。スクリプト間でその値を渡す方法を見つける。何かmyfile.ipynb輸入X 'から(あなたは '.ipynb'ファイルとインポートの種類を行うことができるかどうかわからないが、あなたは私が何を意味するかを見ています'のような? – blacksite

+0

はお返事をいただき、ありがとうございます。私が欲しいということですノートブックはあまりひどくコード化されていません... – JMSH

答えて

12

%run magic documentationあなたは見つけることができます:

-iの代わりにIPythonの名前空間内のファイルを実行します空のもの。インタラクティブに定義された変数に依存するテキストエディタで書かれたコードを試している場合に便利です。

したがって、-iを供給することは、トリックを行います。

%run -i 'script.py' 

"正しい" 方法は、それが

たぶん、上記のコマンドはあなたが必要なものだけで行うには、しかし、とこの質問にすべての注意を払うと、私は、もっとpythonicな方法がどのように見えるかわからない人のために、もう少しセントをそれに加えることに決めました。
上記の解決策はちょっと厄介で、他のファイルのコードを混乱させます(x変数はどこから来ていますか?f関数は何ですか?)。

実際に別のファイルを何度も何度も実行しなくても、その方法を説明したいと思います。
独自の関数とクラスを持つモジュールに変換し、それをJupyterのノートブックまたはコンソールからインポートするだけです。これには、簡単に再利用できるというメリットもありますし、Jupytersのコンテクストアシスタントがあなたに自動補完を手伝ったり、手書きを書いた場合にドキュメントストリングを表示したりすることができます。
他のファイルを常に編集している場合は、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()) 
関連する問題