2017-02-10 48 views
10

我正在Python笔记本上工作,我想大输入代码[输入]打包成[* .PY]文件并从笔记本调用此文件。如何从Jupyter笔记本上的* .IPYNB文件执行* .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行代码,它有足够多。
+0

你'x'变量是本地的你'.ipynb'文件, *不是*你的'.py'文件。 '.py'文件对'x'不知道。找到一种在脚本之间传递该值的方法。就像'from myfile.ipynb import x'(不知道你是否可以用'.ipynb'文件做这种类型的导入,但你明白我的意思吗? – blacksite

+0

谢谢你的回复。我想要的是笔记本的编码不是很密集...... – JMSH

回答

12

%run magic documentation你可以找到:

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

因此,供应-i的伎俩:

%run -i 'script.py' 

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

也许上面的命令是你需要的东西,但随着所有这些问题都得到了关注,我决定为那些不知道更多pythonic方式如何的人增加几分钱。
上面的解决方案有点不方便,并且使其他文件中的代码混淆(此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 
1

也许不是很优雅,但它的工作:

exec(open("script.py").read()) 
相关问题