【问题标题】:How to execute a * .PY file from a * .IPYNB file on the Jupyter notebook?如何从 Jupyter 笔记本上的 * .IPYNB 文件执行 * .PY 文件?
【发布时间】:2017-06-29 01:01:45
【问题描述】:

我正在编写 Python Notebook,我希望将 大型输入代码 [input] 打包到 [* .PY] 文件中并从笔记本中调用这些文件

我知道从 Notebook 运行 [.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 行代码,它已经足够了。

【问题讨论】:

  • 您的 x 变量是您的 .ipynb 文件的本地变量,不是您的 .py 文件。 .py 文件不知道 x。找到一种在脚本之间传递该值的方法。 from myfile.ipynb import x 之类的东西(不知道您是否可以使用 .ipynb 文件进行这种类型的导入,但您明白我的意思吗?
  • 感谢您的回复。我想要的是笔记本的编码不是很重......

标签: python jupyter


【解决方案1】:

%run magic documentation你可以找到:

-i 在 IPython 的命名空间而不是空的命名空间中运行文件。如果您正在试验使用文本编辑器编写的代码,该代码依赖于交互定义的变量,这将非常有用。

因此,提供-i 就可以了:

%run -i 'script.py'

“正确”的做法

也许上面的命令正是您所需要的,但是由于这个问题得到了所有关注,我决定为那些不知道更 Pythonic 方式的人多加几分钱。
上面的解决方案有点hacky,并且使另一个文件中的代码令人困惑(这个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

【讨论】:

    【解决方案2】:

    下面几行也可以

    !python script.py
    

    【讨论】:

      【解决方案3】:

      也许不是很优雅,但确实可以:

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

      【讨论】:

        【解决方案4】:

        !python 'script.py'

        将 script.py 替换为你的真实文件名,不要忘记''

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-26
          • 2022-11-11
          • 1970-01-01
          相关资源
          最近更新 更多