Rozumiem, że IPython nie jest świadomy Virtualenv i że najbardziej logicznym rozwiązaniem jest zainstalowanie ipythona w każdym virtualenv osobno przy użyciu
pip install ipython
Jak na razie dobrze. Jedną z rzeczy, które zauważyłem, jest to, że jeśli ogólnosystemowa kopia IPythona jest wywoływana z poziomu virtualenv, $> ipython
zanim IPython zostanie zainstalowany pod tym virtualenv, kolejne $> ipython
polecenia będą nadal wywoływać ogólnosystemową kopię ipythona.
Z drugiej strony, jeśli ipython nie zostanie wywołany przed zainstalowaniem go pod virtualenv $> ipython
, wyświetli nowo zainstalowaną kopię.
Jakie jest tego wytłumaczenie?
Zastanawiam się również, czy to zachowanie oznacza, że powinienem spodziewać się po drodze kłopotów?
python
virtualenv
ipython
Mo Sander
źródło
źródło
ipython
gdzieś lokalizację pliku wykonywalnego ( zobacz to pytanie ).hash -r
usunięcie pamięci podręcznej wcześniej uruchomionych poleceń, co zwykle jest wykonywane w ramach aktywacji pliku env. Sprawdźhash -r
w ENV / bin / Activ.hash -r
przed aktywacją środowiska env rozwiązuje problem. FYI Pracowałem z virtualenv 1.10.1Odpowiedzi:
alias ipy="python -c 'import IPython; IPython.terminal.ipapp.launch_new_instance()'"
To świetny sposób, aby zawsze mieć pewność, że instancja ipython zawsze należy do wersji Pythona virtualenv.
Działa to tylko na ipythonie> 2.0.
Źródło
źródło
Odpowiedź udzielona przez @SiddharthaRT jest dobra! Zgodnie z tym podejściem jest dla mnie prostsze po prostu:
Spowoduje to użycie modułu IPython przez bin Pythona, upewniając się, że odwołuje się on do bin z wirtualnego środowiska env.
źródło
Możesz wymusić na IPythonie korzystanie ze środowiska wirtualnego, jeśli jest dostępne, dodając poniższy plik do
~/.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)
Zalecam nazwanie go,
00-virtualenv.py
aby zmiany zostały wprowadzone jak najwcześniej.Uwaga: upewnij się, że ipython jest zainstalowany w nowym środowisku wirtualnym, aby to zadziałało.
źródło
Jak wspominali inni, ostatnie wersje ipython są świadome virtualenv, więc możesz użyć skryptu aktywacji binarki virtualenv, aby uruchomić ipython za pomocą virtualenv, np.
$ source venv/bin/activate (venv) $ ipython WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.
źródło
ipython --version; cat /etc/issue
Aktywuj swoje wirtualne środowisko za pomocą source ~ / .virtualenvs / my_venv / bin / activ lub uruchamiając workon my_venv (w zależności od tego, jak zainstalowałeś wirtualne środowisko my_venv)
Zainstaluj ipython
Jeśli nadal ładuje ipython systemu, uruchom
źródło
Jeśli próbujesz otworzyć notebooka, nawet ipython 5 nie pomoże - ipython zignoruje virtualenv (przynajmniej na moim komputerze / konfiguracji). Będziesz musiał użyć skryptu rgtk, ale pamiętaj, aby zmodyfikować opcjonalną część filtru i sys.path.insert, jak poniżej:
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)
źródło
(Debian / Ubuntu) zakładając, że jest zainstalowana jakaś wersja (x) Python3, to:
$ sudo apt-get install -y ipython $ virtualenv --python=python3.x .venv $ source .venv/bin/activate $ pip3 install ipython $ ipython3
uruchomi ipython z Twoją wersją Python3.
źródło
Będę dzwonił po latach w nadziei, że ktoś uzna to za przydatne.
To rozwiązanie rozwiązuje kilka problemów:
3.6 != 3.7
).pyenv
których może znajdować się Twoja globalna wersja Pythona,3.7
a Twój lokalny virtualenv Python3.6
używa w związku z tym globalnegoipython
zawiedzie.python
).Wrzuć to do swojego
~/.bashrc
lub~/.zshrc
lub co masz:# 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 }
Następnie
source
lub otwórz nowy terminal i uruchomipy
.źródło