从virtualenv调用IPython


83

我知道IPython不支持virtualenv,对此最合乎逻辑的解决方案是使用以下命令分别在每个virtualenv中安装ipython

pip install ipython

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

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

这有什么解释?

这也让我怀疑这种行为是否意味着我应该期待一些麻烦?


10
IPython的最新版本无需单独安装即可识别virtualenvs-启动时,您会看到“正在尝试在virtualenv中工作”消息。您看到的“ sticky”命令是bash将ipython可执行文件的位置缓存在某个位置(请参阅此问题)。
Thomas K

Thomas,感谢您提供有关bash缓存的链接,看来这正是发生的情况。IPython 1.1.0向我显示了“正在尝试在virtualenv中工作”警告,但是除非安装在virtualenv中,否则它无法识别virtualenv-但这很好,我只是想确保该过程没有问题。
Mo Sander 2013年

7
您正在使用什么版本的virtualenv,以及如何激活环境?您缺少的命令是hash -r,它将删除以前运行的命令的缓存,该缓存通常是在激活环境时执行的。检查hash -rENV / bin / activate。
明斯克

1
是的,没错!正如Thomas所指出的那样,这是一个bash缓存问题,并且hash -r在激活环境解决该问题之前运行。仅供参考,我正在使用virtualenv 1.10.1
Mo Sander

Answers:


108

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

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

这仅适用于ipython> 2.0。

资源


1
顺便说一句,个人资料名称可以通过kwargs传递。感谢您的回答!
roboslone

22

@SiddharthaRT给出的答案很好!按照这种方法,对我来说更简单:

python -m IPython

这将通过python bin使用模块IPython,确保它引用了虚拟环境中的bin。


10

您可以通过将以下文件添加到来强制IPython使用虚拟环境(如果可用)~/.ipython/profile_default/startups

import os
import sys

if 'VIRTUAL_ENV' in os.environ:
    py_version = sys.version_info[:2] # formatted as X.Y 
    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)

我建议命名它,00-virtualenv.py以便尽早进行更改。

注意:请确保在新的虚拟环境中安装了ipython,以使其正常工作。


1
这在Python 2环境中很好用,但是在版本3环境中,我收到一个ImportError,指出没有名为“ IPython”的模块。在环境之外运行ipython3可行,您知道我在这里缺少什么吗?
efr4k '16

谢谢你 但是我认为“可选”行与python3断开,因为sys.path变成了一个不响应列表方法的过滤器对象,对吗?
mota

5

如其他人所述,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.

1
这么多下注。如果这对您不起作用,请用一条错误消息和以下内容进行注释:ipython --version; cat /etc/issue
JDiMatteo

2
这将适用于IPython的控制台,但不适用于其他事物,例如IPython内核。
Błażej米哈利克

5
  1. 通过使用源〜/ .virtualenvs / my_venv / bin / activate或通过在my_venv 上运行work来激活您的虚拟环境(取决于您如何安装my_venv虚拟环境)

  2. 安装ipython

点安装ipython

  1. 现在从my_venv运行ipython。

如果仍然加载系统的ipython,则运行

哈希-r


1

如果您尝试打开笔记本,即使ipython 5也无济于事-ipython会无视virtualenv(至少在我的机器/安装程序上)。您将需要使用rgtk的脚本,但是请确保按如下所示修改可选的过滤器部分和sys.path.insert:

import os
import sys

if 'VIRTUAL_ENV' in os.environ:
    py_version = sys.version_info[:2] # formatted as X.Y 
    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:在原始脚本中,我们返回一个过滤器对象,我们将破坏sys.path并在下面插入将失败
  • ADD2:请参阅此问题python文档

1

(Debian / Ubuntu)假设已安装某些版本的Python3(x),则:

$ sudo apt-get install -y ipython
$ virtualenv --python=python3.x .venv
$ source .venv/bin/activate
$ pip3 install ipython
$ ipython3

将启动运行您的Python3版本的ipython。


1

几年后,我会发出提示音,希望有人会觉得有用。

此解决方案解决了一些问题:

  • 您不需要在当前的virtualenv中安装iPython,只需为与您的virtualenv的Python版本(3.6 != 3.7)相匹配的全局Python安装。
  • 适用于pyenv您的全局Python版本所在的用户,因此3.7您的本地virtualenv Python正在3.6使用全局Python版本ipython将失败。
  • 在虚拟环境之外工作(尽管并非总是有用,但它并不是特别有用python)。

将此扔到您的~/.bashrc~/.zshrc或您拥有的物品中:

# This is a roundabout way to start ipython from inside a virtualenv without it being installed
# in that virtualenv. The only caveot is that the "global" python must have ipython installed.
# What this function does that's different than simply calling the global ipython is it ensures to
# call the ipython that is installed for the same major.minor python version as in the virtualenv.
# This is most useful if you use pyenv for example as global python3 could be 3.7 and local
# virtualenv python3 is 3.6.
function ipy {
  local PY_BIN
  local IPYTHON
  local PYV
  # This quick way will work if ipython is in the virtualenv
  PY_BIN="$(python -c 'import sys; print(sys.executable)')"
  IPYTHON="$(dirname "$PY_BIN")/ipython"
  if [[ -x "$IPYTHON" ]]; then
    "$IPYTHON"
  else
    # Ask the current python what version it is
    PYV="$(python -c 'import sys; print(".".join(str(i) for i in sys.version_info[:2]))')"
    echo "Looking for iPython for Python $PYV"
    # In a new shell (where pyenv should load if equipped) try to find that version
    PY_BIN="$($SHELL -i -c "python$PYV -c 'import sys; print(sys.executable)'")"
    "$(dirname "$PY_BIN")/ipython"
  fi
}

然后source或打开一个新终端并运行ipy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.