1. ホーム
  2. python

[解決済み] Jupyterノートブック上で* .IPYNBファイルから* .PYファイルを実行するにはどうすればよいですか?

2023-07-19 07:08:26

質問

私はPythonノートブックに取り組んでいて、次のことを望んでいます。 大きな入力コード[input] を[* .PY]ファイルにパックし、ノートブックからこのファイルを呼び出します。 .

を実行する動作は、[ .PY] ファイルを Notebook から実行することは知られており、コマンドは 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 行のコードではなく、もっと十分なコードを持っています。

どのように解決するのですか?

%run マジックドキュメント を見つけることができます。

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

そのため -i を指定するとうまくいきます。

%run -i 'script.py'


正しい方法とは?

多分、上のコマンドはあなたが必要とするものだと思いますが、この質問が注目されているため、よりpythonicな方法がどのように見えるかを知らない人のために、もう少しセントを加えることにしました。

上記の解決策は少しハチャメチャで、他のファイルのコードを混乱させます(どこでこの 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