从不同的源文件以编程方式诱导ippython笔记本输出单元



假设存在一个Python文件myfile.py。该文件的内容可以被视为粘贴到IPython笔记本中的单个单元格中,然后执行(生成的任何输出都应该在笔记本中生成)。

是否有可能通过编程导致这种情况发生?也就是说,我想调用类似"python myfile.py"的东西,结果是启动一个笔记本,弹出一个选项卡,并且只有myfile.py产生的输出已经显示在笔记本中。

我特别希望避免.py文件"变成笔记本",而要执行的代码显示为输入单元格的情况。

这个想法是为了调用这个.py文件像一个web应用程序一样工作——所以只有输出应该在笔记本中弹出。但是,笔记本的内核应该仍然在运行,以防必须从.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 npn",
NameError: name 'false' is not defined

只是删除anaconda,不知何故它导致了这个问题。要删除它,只需执行rm -rf ~/anaconda并再次尝试执行%run(假设您具有所有pandas/python要求)

最新更新