如何从Jupyter笔记本上的* .IPYNB文件执行* .PY文件?


71

我正在使用Python笔记本工作,我希望将较大的输入代码[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行代码,它具有更多的代码。

1
您的x变量是本地的.ipynb文件,不是你的.py文件。该.py文件不了解x。找到一种在脚本之间传递该值的方法。有点像from myfile.ipynb import x(不知道是否可以对.ipynb文件进行这种类型的导入,但是您是否明白我的意思?
blacksite

谢谢您的回复。我想要的是笔记本的编码不是很重...
JMSH

Answers:


100

%run魔术文档中,您可以找到:

-i在IPython的名称空间而不是空名称空间中运行文件。如果您要试验用文本编辑器编写的代码,该代码取决于交互式定义的变量,则此功能很有用。

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

%run -i 'script.py'

做到这一点的“正确”方法

也许上面的命令正是您所需要的,但是在这个问题得到所有关注的基础上,我决定为不知道如何使用pythonic方式的用户增加几分钱。
上面的解决方案有点笨拙,并且使另一个文件中的代码令人困惑(此x变量从何而来?f函数是什么?)。

我想向您展示如何做到这一点,而不必一遍又一遍地执行另一个文件。
只需将其转换为具有其自身功能和类的模块,然后从Jupyter笔记本或控制台导入即可。这还具有使其易于重用的优点,并且jupyters contextassantant可以帮助您自动完成,或者如果您编写了docstring,则可以显示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


17

也许不是很优雅,但是可以做到:

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

5

!python'script.py'

用您的真实文件名替换script.py,别忘了''

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.