从virtualenv调用IPython

我明白,IPython不是virtualenv意识 ,最合理的解决scheme是安装ipython在每个virtualenv单独使用

pip install ipython 

到现在为止还挺好。 我注意到的一件事是,如果IPython安装在这个virtualenv之前,如果在virtualenv中使用$> ipython调用IPython的系统范围副本,后续的$> ipython命令将继续调用系统范围的ipython副本。

另一方面,如果ipython在virtualenv下安装之前没有被调用, $> ipython会调出新安装的副本。

这是什么解释?

这也让我怀疑这个行为是否意味着我应该预料到一些麻烦?

alias ipy="python -c 'import IPython; IPython.terminal.ipapp.launch_new_instance()'"

这是确保ipython实例始终属于virtualenv的python版本的好方法。

这只适用于ipython> 2.0。

资源

你可以强制IPython使用虚拟环境,如果可以的话,通过在~/.ipython/profile_default/startups添加下面的文件:

 import os import sys if 'VIRTUAL_ENV' in os.environ: py_version = sys.version_info[:2] # formatted as XY py_infix = os.path.join('lib', ('python%d.%d' % py_version)) virtual_site = os.path.join(os.environ.get('VIRTUAL_ENV'), py_infix, 'site-packages') dist_site = os.path.join('/usr', py_infix, 'dist-packages') # OPTIONAL: exclude debian-based system distributions sites sys.path = filter(lambda p: not p.startswith(dist_site), sys.path) # add virtualenv site sys.path.insert(0, virtual_site) 

我build议将其命名为00-virtualenv.py以便尽早进行更改。

正如其他人提到的,最新版本的ipython是virtualenv意识到的,所以你可以使用你的virtualenv bin 激活脚本来使用你的virtualenv运行ipython,例如

 $ source venv/bin/activate (venv) $ ipython WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv. 

如果你想打开一个笔记本,即使ipython 5不会帮助–ipython会忽略virtualenv(至less在我的机器/设置)。 您需要使用rgtk的脚本,但是请确保修改可选的filter部分和sys.path.insert,如下所示:

 import os import sys if 'VIRTUAL_ENV' in os.environ: py_version = sys.version_info[:2] # formatted as XY py_infix = os.path.join('lib', ('python%d.%d' % py_version)) virtual_site = os.path.join(os.environ.get('VIRTUAL_ENV'), py_infix, 'site-packages') dist_site = os.path.join('/usr', py_infix, 'dist-packages') # OPTIONAL: exclude debian-based system distributions sites # ADD1: sys.path must be a list sys.path = list(filter(lambda p: not p.startswith(dist_site), sys.path)) # add virtualenv site # ADD2: insert(0 is wrong and breaks conformance of sys.path sys.path.insert(1, virtual_site) 
  • ADD1:在原始脚本中我们得到一个filter对象,我们将打破sys.path,并在下面插入将失败
  • ADD2:看到这个问题和Python文档