从ipzope调用时如何将类路径传递给ipython的笔记本?

时间:2014-03-22 14:38:05

标签: python ipython-notebook buildout

我从ipzope(buildout)开始使用iypthon已经有一段时间了,它没有问题。

现在我正在尝试使用ipython的笔记本,我无法正确设置它。

当我创建一个新的笔记本时,它会使用ImportError停止IPython的内核(见下文)。 我想在IPython.html.notebook.start()中创建的主题打开了webbrowser而没有从调用进程传递sys.path

我的解决方法是将ipzope中的路径添加到PYTHONPATH

当我添加所有路径时,ipython的笔记本完美运行,我可以调试和操作Plone。

如果我只将ipythonpyzmqJinjatornado添加到PYTHONPATH ipython的笔记本中,但它无法访问{{1 vars(ipzopeapp等。)

问题:有没有提示如何在不使用utils的情况下将路径传递给ipython的笔记本?

我使用

PYTHONPATH启动ipython的笔记本
ipzope

ImportError是:

sys.argv[1:1] = "notebook --ip=192.168.45.135 --profile=zope".split()

1 个答案:

答案 0 :(得分:2)

我引用Min RK IPython developer

  

“当你启动普通终端IPython时,shell会在   同样的过程。这意味着IPython在相同的上下文中执行   您对sys.path所做的更改,因此更改具有所需的更改   影响。在笔记本中,只存在笔记本服务器   上下文。内核作为子进程启动,因此重新创建   启动时的sys.path,遵循Python的标准过程   进程,并且不会继承对sys.path的任何运行时更改   在父进程中发生过。“   (https://github.com/ipython/ipython/issues/5420

我的解决方案

因此,将路径传递给笔记本的唯一方法是通过PYTHONPATH

我现在的解决方法是在脚本中设置os.environ['PYTHONPATH'] = ':'.join(sys.path)。有了这个,您不需要弄乱系统的PYTHONPATH(如果有的话),并确保将所有必要的路径传递给内核。

os.environ作为env Popen参数传递给launch_kernel.../ipython-1.2.1-py2.7.egg/IPython/kernel/launcher.py)中的子流程。

如果您需要使用ipython的笔记本并希望buildout生成脚本,请将以下内容添加到您的buildout中(例如在.../Plone-4.3.2/zeocluster/develop.cfg中)

parts +=
...
    ipzopenb
...
[ipzopenb]
recipe = zc.recipe.egg
eggs =
    ipython
    pyzmq
    tornado
    Jinja2
#following for nbconvert
    Pygments
    Sphinx
    ${client2:eggs}
initialization =
    import sys, os
    os.environ["INSTANCE_HOME"] = "${client2:location}"
    os.environ['PYTHONPATH'] = ':'.join(sys.path)
    sys.argv[1:1] = "notebook --ip=192.168.45.135 --profile=zope".split()
scripts = ipython=ipzopenb
...
[versions]
Jinja2 = 2.7.2
Pygments = 1.6
Sphinx = 1.2.2
相关问题