Подтвердить что ты не робот

Вызов IPython из виртуального

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

pip install ipython

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

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

Каково объяснение этого?

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

4b9b3361

Ответ 1

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

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

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

Источник

Ответ 2

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

Ответ 3

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

python -m IPython

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

Ответ 4

Как уже упоминалось, последние версии ipython поддерживают virtualenv, поэтому вы можете использовать Activate скрипт 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.

Ответ 5

Если вы пытаетесь открыть ноутбук, даже ipython 5 не поможет - ipython будет игнорировать virtualenv (по крайней мере, на моем компьютере/настройке). Вам нужно будет использовать rgtk script, но обязательно измените необязательную часть фильтра и 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)

Ответ 6

(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.

Ответ 7

  1. Активируйте свою виртуальную среду, используя source ~/.virtualenvs/my_venv/bin/activ или запустив workon my_venv. (В зависимости от того, как вы установили виртуальную среду my_venv)

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

pip install ipython

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

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

hash -r

Ответ 8

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

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

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