从不同源文件程序化引发IPython notebook输出单元
假设有一个Python文件叫做myfile.py
。这个文件的内容可以想象成是直接粘贴到一个IPython笔记本的单个单元格里,然后执行它(生成的任何输出也应该在这个笔记本中显示出来)。
我想知道有没有办法通过编程的方式实现这个?也就是说,我希望能像运行“python myfile.py”那样,启动一个笔记本,弹出一个标签页,并且只显示myfile.py文件运行后产生的输出,而不是显示代码本身。
我特别想避免的情况是,把.py文件“转化为笔记本”,然后代码作为输入单元格出现。
我的想法是,让这个.py文件的调用像一个网页应用一样——只弹出输出在笔记本中。笔记本的内核仍然应该在运行,以便处理需要从.py文件回调的交互。
在IPython中,似乎每个部分都已经存在(交互式小部件、转化为笔记本,甚至可以用Popen来启动笔记本)——但不清楚如何从一个普通的.py文件启动,使得只显示输出。
这是我的一个尝试:
import sys
import subprocess
from IPython.nbformat import current as nbf
# Parse the output cell needed from the file
py_file_name = sys.argv[1]
with open(py_file_name, 'r') as py_file:
py_code = py_file.read()
# Set an input cell and invoke it.
nb = nbf.new_notebook()
cells = [nbf.new_code_cell(py_code)]
nb['worksheets'].append(nbf.new_worksheet(cells=cells))
# Store the result into a notebook.
notebook_name = py_file_name + '.ipynb'
with open(notebook_name, 'w') as f:
nbf.write(nb, f, 'ipynb')
# Launch a new IPython notebook kernel
subprocess.call(["ipython", "-c", "'%run {}'".format(notebook_name)])
这并不是理想的情况——因为它仍然需要我填充单元格的输入部分,然后实际打开文件并执行它。
即便如此,当我在底部使用%run
选项时,仍然会出现错误,像这样:
ely@eschaton:~$ python launcher.py myfile1.py
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/home/ely/anaconda/lib/python2.7/site-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
202 else:
203 filename = fname
--> 204 __builtin__.execfile(filename, *where)
/home/ely/myfile1.py.ipynb in <module>()
8 {
9 "cell_type": "code",
---> 10 "collapsed": false,
11 "input": [
12 "import numpy as np\n",
NameError: name 'false' is not defined
1 个回答
0
只要把anaconda删掉就行,似乎是它导致了这个问题。删除的方法很简单,执行 rm -rf ~/anaconda
这个命令,然后再试着运行 %run
(假设你已经安装了所有需要的pandas和ipython)。