Вызов IPython из virtualenv

84

Я понимаю, что IPython не поддерживает virtualenv и что наиболее логичным решением этого является установка ipython в каждом virtualenv отдельно, используя

pip install ipython

Все идет нормально. Я заметил одну вещь: если общесистемная копия IPython вызывается из virtualenv с использованием $> ipythonдо того, как IPython будет установлен в этом virtualenv, последующие $> ipythonкоманды будут продолжать вызывать общесистемную копию ipython.

С другой стороны, если ipython не вызывается перед его установкой под virtualenv, $> ipythonпоявится новая установленная копия.

Какое этому объяснение?

Это также заставляет меня задуматься, означает ли такое поведение, что в будущем мне следует ожидать каких-то проблем?

Мо Сандер
источник
10
Последние версии IPython должны распознавать virtualenvs без необходимости устанавливать отдельно - при запуске вы увидите сообщение «пытается работать в virtualenv». Вы видите "липкую" команду - это bash, где-то кэширует расположение ipythonисполняемого файла ( см. Этот вопрос ).
Thomas K
Томас, спасибо за ссылку про кеширование bash, вроде именно так и происходит. IPython 1.1.0 показывает мне предупреждение «Попытка работать в virtualenv», но он не распознает virtualenv, если он не установлен в virtualenv - но это нормально, я просто хотел убедиться, что процедура не вызывает проблем.
Мо Сандер
7
какую версию virtualenv вы используете и как активируете env? Вам не хватает команды hash -r, которая удаляет кеш ранее запущенных команд, что обычно выполняется как часть активации env. Проверьте hash -rв ENV / bin / activate.
minrk
1
Да, верно! Как указал Томас, это была проблема кеширования в bash, и запуск hash -rдо активации env решает проблему. К вашему сведению, я работал с virtualenv 1.10.1
Мо Сандер

Ответы:

109

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

Это отличный способ всегда быть уверенным, что экземпляр ipython всегда принадлежит версии python virtualenv.

Это работает только на ipython> 2.0.

Источник

SiddharthaRT
источник
1
Кстати, имя профиля можно передать через kwargs. Спасибо за такой ответ!
roboslone 01
25

Ответ @SiddharthaRT хорош! Следуя этому подходу, мне проще:

python -m IPython

Это будет использовать модуль IPython через bin python, гарантируя, что он ссылается на bin из виртуального env.

jcozar87
источник
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 установлен в новой виртуальной среде, чтобы это работало.

rgtk
источник
1
Это отлично работает в средах Python 2, но в env версии 3 я получаю ImportError, в которой говорится, что нет модуля с именем «IPython». Запуск ipython3 вне среды работает, вы знаете, что мне здесь не хватает?
efr4k 01
Спасибо за это. Но я думаю, что строка «Необязательный» прерывается на python3, поскольку sys.path становится объектом фильтра, который не отвечает на методы списка, верно?
mota
6

Как уже упоминалось, последние версии ipython осведомлены о virtualenv, поэтому вы можете использовать свой скрипт активации virtualenv bin для запуска ipython с использованием вашего virtualenv, например

$ source venv/bin/activate
(venv) $ ipython
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
JDiMatteo
источник
2
Так много голосов против. Если это не сработает для вас, прокомментируйте, ipython --version; cat /etc/issue
добавив
2
Это будет работать с консолью IPython, но не будет работать с другими вещами, например ядром IPython.
Błażej Michalik
5
  1. Активируйте свою виртуальную среду с помощью источника ~ / .virtualenvs / my_venv / bin / activate или запустив workon my_venv (в зависимости от того, как вы установили виртуальную среду my_venv)

  2. Установить ipython

pip установить ipython

  1. Теперь запустите ipython из my_venv.

Если он все еще загружает системный ipython, запустите

хэш -r

TheDataGuy
источник
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)
Фабио Скакабароцци
источник
1

(Debian / Ubuntu) при условии, что установлена ​​некоторая версия (x) Python3, тогда:

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

запустит ipython с вашей версией Python3.

Mjkrause
источник
1

Я буду звонить через несколько лет в надежде, что кто-то сочтет это полезным.

Это решение решает несколько проблем:

  • Вам не нужно, чтобы iPython был установлен в текущем virtualenv, только для глобального Python, который соответствует вашей версии Python virtualenv ( 3.6 != 3.7).
  • Работает для пользователей, pyenvгде может быть ваша глобальная версия 3.7Python, и 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.

Скиннер927
источник