Виклик IPython з virtualenv


83

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

pip install ipython

Все йде нормально. Одне, що я помітив, це те, що якщо загальносистемна копія IPython викликається зсередини virtualenv за допомогою $> ipythonдо встановлення IPython під цим virtualenv, наступні $> ipythonкоманди продовжуватимуть виводити загальносистемну копію ipython.

З іншого боку, якщо ipython не буде викликано до встановлення його під virtualenv, ви $> ipythonпобачите нещодавно встановлену копію.

Яке пояснення цьому?

Це також змушує мене замислюватися, чи така поведінка означає, що я маю очікувати певних неприємностей?


10
Останні версії IPython повинні розпізнавати virtualenvs без необхідності встановлювати їх окремо - ви побачите повідомлення "намагається працювати у virtualenv" при його запуску. Команда `` липкий '', яку ви бачите, - це кешування кешу ipythonдесь розташування виконуваного файлу ( див. Це запитання ).
Thomas K

Томасе, дякую за посилання про кешування кеш-файлів, здається, що саме це відбувається. IPython 1.1.0 показує мені попередження "Спроба роботи в virtualenv", але він не розпізнає virtualenv, якщо він не встановлений у virtualenv - але це чудово, я просто хотів переконатися, що процедура є проблематичною.
Mo Sander

7
яку версію virtualenv ти використовуєш, і як ти активуєш env? Команда, яку ви пропустили, є hash -r, яка скидає кеш попередньо запущених команд, яка зазвичай виконується в рамках активації env. Перевірте наявність hash -rу ENV / bin / activate.
minrk

1
так, правда! Як зазначав Томас, це було проблемою кешування bash і було запущено hash -rдо того, як активація env вирішить проблему. FYI Я працював з virtualenv 1.10.1
Mo Sander

Відповіді:


108

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

Це чудовий спосіб завжди бути впевненим, що екземпляр ipython завжди належить до версії python virtualenv.

Це працює лише на ipython> 2.0.

Джерело


1
До речі, ім'я профілю можна передавати через kwargs. Дякую за цю відповідь!
roboslone

22

Відповідь, яку дав @SiddharthaRT, хороша! Дотримуючись цього підходу, для мене це простіше просто:

python -m IPython

Для цього буде використаний модуль IPython через python bin, гарантуючи, що він посилається на bin з віртуального env.


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 envs я отримую ImportError із зазначенням, що немає модуля з назвою "IPython". Запуск ipython3 поза середовищем працює, чи знаєте ви, чого мені тут не вистачає?
efr4k

Дякую за це. Але я думаю, що "Необов'язковий" рядок розривається з python3, оскільки sys.path стає об'єктом фільтра, який не реагує на методи списку, так?
mota

5

Як згадували інші, останні версії ipython обізнані з virtualenv, тому ви можете використовувати скрипт активації коду virtualenv для запуску 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.

1
Так багато голосів проти. Якщо у вас це не працює, будь ласка, коментуйте повідомлення про помилку та виведенняipython --version; cat /etc/issue
JDiMatteo

2
Це буде працювати з консоллю IPython, але не працюватиме з іншими речами, наприклад, ядром IPython.
Błażej Michalik

5
  1. Активуйте своє віртуальне середовище, використовуючи source ~ / .virtualenvs / my_venv / bin / activate або запустивши workon my_venv (Залежно від того, як ви встановили віртуальне середовище my_venv)

  2. Встановіть ipython

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

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

Якщо він все ще завантажує системний 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)

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.


1

Я буду лунати через кілька років, сподіваючись, що хтось вважає це корисним.

Це рішення вирішує кілька проблем:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.