从不同源文件程序化引发IPython notebook输出单元

3 投票
1 回答
1095 浏览
提问于 2025-04-18 06:09

假设有一个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)。

撰写回答