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

JMS*_*MSH 44 python jupyter

我正在研究Python笔记本,我希望将大量输入代码[输入] 打包成[*.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
Run Code Online (Sandbox Code Playgroud)

" script.py "具有以下内容:

plt.plot(x, f(x))
plt.xlabel("Eje $x$",fontsize=16)
plt.ylabel("$f(x)$",fontsize=16)
plt.title("Funcion $f(x)$")
Run Code Online (Sandbox Code Playgroud)
  • 在真正的问题中,文件[*.PY]没有4行代码,它有足够的代码.

swe*_*zel 67

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

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

因此,提供-i诀窍:

%run -i 'script.py'
Run Code Online (Sandbox Code Playgroud)

这是"正确"的方式

也许上面的命令正是你所需要的,但是随着这个问题得到了所有的关注,我决定为那些不知道如何更像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)$")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


bra*_*raj 13

以下几行也可以

!python script.py
Run Code Online (Sandbox Code Playgroud)


小智 10

也许不是很优雅,但它确实起作用:

exec(open("script.py").read())
Run Code Online (Sandbox Code Playgroud)


小智 5

!python'script.py'

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