virtualenv에서 IPython 호출


84

나는 IPython이 virtualenv를 인식 하지 못하며 이에 대한 가장 논리적 인 해결책은 각 virtualenv에 ipython을 별도로 설치 하는 것임을 이해합니다.

pip install ipython

여태까지는 그런대로 잘됐다. 내가 알아 차린 한 가지는 IPython $> ipython이이 virtualenv 아래에 설치되기 전에 사용하는 virtualenv 내에서 IPython의 시스템 전체 복사본이 호출 되면 후속 $> ipython명령이 시스템 전체 ipython 복사본을 계속 불러 온다는 것입니다.

반면에, ipython을 virtualenv 아래에 설치하기 전에 호출 하지 않으면$> ipython 새로 설치된 복사본을 가져옵니다.

이것에 대한 설명은 무엇입니까?

또한이 동작이 문제가 발생할 것으로 예상해야하는지 궁금합니다.


10
최신 버전의 IPython은 별도로 설치할 필요없이 virtualenv를 인식해야합니다. 시작할 때 "virtualenv에서 작업 시도 중"메시지가 표시됩니다. 보이는 'sticky'명령은 ipython어딘가에 실행 파일 의 위치를 ​​bash 캐싱하는 것입니다 ( 이 질문 참조 ).
Thomas K

Thomas, bash 캐싱에 대한 링크에 감사드립니다. 이것이 정확히 일어나는 것 같습니다. IPython 1.1.0은 'Attempting to work in a virtualenv'경고를 표시하지만 virtualenv 내에 설치되지 않는 한 virtualenv를 인식하지 못합니다.하지만 절차가 문제가 없는지 확인하고 싶었습니다.
Mo Sander

7
어떤 버전의 virtualenv를 사용하고 있으며 환경을 어떻게 활성화하고 있습니까? 누락 된 명령 hash -r은 이전에 실행 한 명령의 캐시를 삭제하는이며 일반적으로 환경 활성화의 일부로 실행됩니다. hash -rENV / bin / activate에서 확인하십시오 .
minrk

1
네, 사실입니다! Thomas가 지적했듯이 이것은 bash 캐싱 문제였으며 hash -renv를 활성화하기 전에 실행 하면 문제가 해결됩니다. 참고로 저는 virtualenv 1.10.1로 작업했습니다
Mo Sander

답변:


110

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

이것은 ipython 인스턴스가 항상 virtualenv의 python 버전에 속하는지 항상 확인하는 좋은 방법입니다.

이것은 ipython 2.0 이상에서만 작동합니다.

출처


1
BTW, 프로필 이름은 kwargs를 통해 전달할 수 있습니다. 답변 해 주셔서 감사합니다!
roboslone

25

@SiddharthaRT의 대답은 좋습니다! 이 접근 방식을 따르면 나에게 더 간단합니다.

python -m IPython

이것은 파이썬 bin을 통해 모듈 IPython을 사용하여 가상 환경의 bin을 참조하는지 확인합니다.


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 환경에서는 "IPython"이라는 모듈이 없다는 ImportError가 발생합니다. 환경 외부에서 ipython3을 실행하면 작동합니다. 내가 여기서 무엇을 놓치고 있는지 알고 있습니까?
efr4k

감사합니다. 하지만 sys.path가 목록 메서드에 응답하지 않는 필터 개체가되므로 "선택 사항"줄이 python3으로 구분됩니다.
mota

6

다른 사람들이 언급했듯이 최신 버전의 ipython은 virtualenv를 인식하므로 virtualenv bin activate 스크립트를 사용하여 virtualenv를 사용하여 ipython을 실행할 수 있습니다.

$ source venv/bin/activate
(venv) $ ipython
WARNING: Attempting to work in a virtualenv. If you encounter problems, please install IPython inside the virtualenv.

2
너무 많은 반대표. 이 당신을 위해의 오류 메시지가 출력, 제발 코멘트 작동하지 않는 경우ipython --version; cat /etc/issue
JDiMatteo

2
이것은 IPython의 콘솔에서 작동하지만 다른 것들 (예 : IPython 커널)에서는 작동하지 않습니다.
Błażej Michalik

5
  1. 소스 ~ / .virtualenvs / my_venv / bin / activate를 사용 하거나 workon my_venv 를 실행 하여 가상 환경을 활성화합니다 (my_venv 가상 환경을 설치 한 방법에 따라 다름).

  2. ipython 설치

pip 설치 ipython

  1. 이제 my_venv에서 ipython을 실행합니다.

여전히 시스템의 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) Python3의 일부 버전 (x)이 설치되어 있다고 가정하고 다음을 수행합니다.

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

Python3 버전을 실행하는 ipython을 시작합니다.


1

누군가가 유용하다고 생각하기를 몇 년 후에 차임 할 것입니다.

이 솔루션은 몇 가지 문제를 해결합니다.

  • 현재 virtualenv에 iPython을 설치할 필요는 없으며 virtualenv의 Python 버전 ( 3.6 != 3.7) 과 일치하는 전역 Python에만 해당됩니다 .
  • 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.