Ответ 1
alias ipy="python -c 'import IPython; IPython.terminal.ipapp.launch_new_instance()'"
Это отличный способ всегда быть уверенным, что экземпляр ipython всегда принадлежит версии virtualenv python.
Это работает только на ipython > 2.0.
Я понимаю, что IPython не virtualenv-aware и что наиболее логичным решением для этого является установка ipython в каждом виртуальном сервере отдельно, используя
pip install ipython
Пока все хорошо. Одна вещь, которую я заметил, это то, что если общесистемная копия IPython вызывается из virtualenv с помощью $> ipython
до того, как IPython будет установлен под этим virtualenv, последующие команды $> 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 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 установлен в новой виртуальной среде, чтобы заставить это работать.
Ответ, данный @SiddharthaRT, хорош! Следуя такому подходу, мне проще:
python -m IPython
Это будет использовать модуль IPython через корзину Python, гарантируя, что он ссылается на корзину из виртуальной среды env.
Как уже упоминалось, последние версии 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.
Если вы пытаетесь открыть ноутбук, даже 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)
(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.
Активируйте свою виртуальную среду, используя source ~/.virtualenvs/my_venv/bin/activ или запустив workon my_venv. (В зависимости от того, как вы установили виртуальную среду my_venv)
Установить ipython
pip install ipython
Если он все еще загружает системный ipython, запустите
hash -r
Я позвоню через несколько лет в надежде, что кто-то найдет это полезным.
Это решение решает несколько проблем:
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
.