web-dev-qa-db-ja.com

Jupyterノートブックの* .IPYNBファイルから* .PYファイルを実行する方法

私はPythonノートブックに取り組んでいます。大きな入力コード[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行のコードはなく、さらに多くのコードがあります。
38
JMSH

%run魔法のドキュメント で見つけることができます:

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

したがって、-iを指定すると、次のトリックが実行されます。

%run -i 'script.py'

それを行う「正しい」方法

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

実際に他のファイルを何度も実行することなく、それを行う方法を示したいと思います。
独自の関数とクラスを備えたモジュールに変換し、Jupyterノートブックまたはコンソールからインポートします。これには、再利用しやすいという利点もあります。jupyterscontextassistantは、オートコンプリートを支援したり、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
58
swenzel

以下の行も機能します

!python script.py
11
braj

たぶん非常にエレガントではありませんが、それは仕事をします:

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

!python 'script.py'

script.pyを実際のファイル名に置き換えます。忘れないでください ''

5
shi95