我从ipzope(buildout)开始使用iypthon已经有一段时间了,它没有问题。
现在我正在尝试使用ipython的笔记本,我无法正确设置它。
当我创建一个新的笔记本时,它会使用ImportError
停止IPython的内核(见下文)。
我想在IPython.html.notebook.start()
中创建的主题打开了webbrowser
而没有从调用进程传递sys.path
。
我的解决方法是将ipzope
中的路径添加到PYTHONPATH
。
当我添加所有路径时,ipython的笔记本完美运行,我可以调试和操作Plone。
如果我只将ipython
,pyzmq
,Jinja
和tornado
添加到PYTHONPATH
ipython的笔记本中,但它无法访问{{1 vars(ipzope
,app
等。)
问题:有没有提示如何在不使用utils
的情况下将路径传递给ipython的笔记本?
我使用
从PYTHONPATH
启动ipython的笔记本
ipzope
ImportError是:
sys.argv[1:1] = "notebook --ip=192.168.45.135 --profile=zope".split()
答案 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