एक virtualenv से IPython कॉलिंग


84

मैं समझता हूं कि IPython virtualenv- अवगत नहीं है और इसका सबसे तार्किक समाधान यह है कि प्रत्येक virtualenv में ipython को अलग से प्रयोग करके स्थापित किया जाए

pip install ipython

अब तक सब ठीक है। एक बात मैंने गौर की है कि अगर IPython के सिस्टम-वाइड कॉपी को एक virtualenv के भीतर से कॉल किया जाता है, तो $> ipythonIPython को इस virtualenv के तहत इंस्टॉल करने से पहले इस्तेमाल किया जाता है, बाद के $> ipythonकमांड सिस्टम-वाइड ipython कॉपी को लाते रहेंगे।

दूसरी ओर, अगर ipython को एक virtualenv के तहत इसे स्थापित करने से पहले नहीं बुलाया जाता है, तो $> ipythonनई स्थापित कॉपी को लाया जाएगा।

इसके लिए स्पष्टीकरण क्या है?

यह भी मुझे आश्चर्यचकित करता है कि क्या इस व्यवहार का मतलब है कि मुझे रास्ते में कुछ परेशानी की उम्मीद करनी चाहिए?


10
IPython के हाल के संस्करणों को अलग से इंस्टॉल किए बिना virtualenvs को पहचानना चाहिए - जब आप शुरू होता है तो आपको "virtualenv में काम करने की कोशिश कर रहा है" दिखाई देगा। 'स्टिकी' कमांड जो आप देख रहे हैं, वह ipythonनिष्पादन योग्य के स्थान को कैशिंग कर रहा है ( यह प्रश्न देखें )।
थॉमस के

थॉमस, बैश कैशिंग के बारे में लिंक के लिए धन्यवाद, ऐसा लगता है कि वास्तव में यही होता है। IPython 1.1.0 मुझे एक 'virtualenv' चेतावनी में काम करने का प्रयास दिखाता है, लेकिन यह virtualenv को तब तक नहीं पहचानता है जब तक कि virtualenv के भीतर स्थापित नहीं होता है - लेकिन यह ठीक है कि मैं सिर्फ यह सुनिश्चित करना चाहता था कि यह प्रक्रिया अप्रमाणिक है।
मो सैंडर

7
वर्चुअनव के कौन से संस्करण का उपयोग कर रहे हैं, और आप कैसे सक्रिय कर रहे हैं? आपके द्वारा याद किया जा रहा कमांड वह है hash -r, जो पहले से चलाए गए कमांड के कैश को ड्राप करता है, जिसे आम तौर पर एनवी को सक्रिय करने के हिस्से के रूप में निष्पादित किया जाता है। hash -rENV / बिन / सक्रिय में जांचें ।
मिनट

1
हाँ सच! जैसा कि थॉमस ने बताया, यह एक बैश कैशिंग मुद्दा था और hash -rएक एनवी को सक्रिय करने से पहले दौड़ना समस्या का समाधान करता है। FYI करें मैं virtualenv के साथ काम कर रहा था 1.10.1
Mo Sander

जवाबों:


109

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

यह हमेशा यह सुनिश्चित करने का एक शानदार तरीका है कि ipython आवृत्ति हमेशा virtualenv के पायथन संस्करण से संबंधित है।

यह केवल ipython> 2.0 पर काम करता है।

स्रोत


1
BTW, प्रोफाइल नाम को kwargs के माध्यम से पारित किया जा सकता है। उस उत्तर के लिए धन्यवाद!
रोबोसलोन

25

@SiddharthaRT द्वारा दिया गया उत्तर अच्छा है! इस दृष्टिकोण के बाद, यह मेरे लिए सरल है:

python -m IPython

यह अजगर के माध्यम से मॉड्यूल आईपीथॉन का उपयोग करेगा, यह सुनिश्चित करेगा कि यह आभासी एनवी से बिन को संदर्भित करता है।


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
यह पायथन 2 वातावरणों में बहुत अच्छा काम करता है, लेकिन संस्करण 3 में मुझे "IPython" नाम का कोई मॉड्यूल नहीं मिला। पर्यावरण के बाहर ipython3 चल रहा है, क्या आप जानते हैं कि मैं यहाँ क्या याद कर रहा हूँ?
efr4k

इसके लिए धन्यवाद। लेकिन मुझे लगता है कि "वैकल्पिक" लाइन python3 के साथ टूट जाती है क्योंकि sys.path एक फ़िल्टर ऑब्जेक्ट बन जाता है जो सूची विधियों के लिए प्रतिक्रिया नहीं देता है, है ना?
मोट

6

जैसा कि दूसरों ने उल्लेख किया है, 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.

2
इतने सारे डाउनवोट। यदि यह आपके लिए काम नहीं करता है, तो कृपया एक त्रुटि संदेश और आउटपुट के साथ टिप्पणी करेंipython --version; cat /etc/issue
JDiMatteo

2
यह IPython के कंसोल के साथ काम करेगा, लेकिन अन्य चीजों के साथ काम नहीं करेगा, उदाहरण के लिए IPython कर्नेल।
बलोएज माइकालिक

5
  1. उपयोग करके अपने आभासी वातावरण को सक्रिय करें स्रोत ~ / .virtualenvs / my_venv / bin / activate या रनिंग वर्कऑन my_venv (यह इस बात पर निर्भर करता है कि आपने my_venv वर्चुअल वातावरण कैसे स्थापित किया है)

  2. Ipython स्थापित करें

पाइप स्थापित करें

  1. अब my_venv से ipython चलाएं।

यदि यह अभी भी सिस्टम के ipython को लोड करता है, तो चलाएं

हैश -आर


1

यदि आप एक नोटबुक खोलने की कोशिश कर रहे हैं, तो भी ipython 5 मदद नहीं करेगा - ipython virtualenv (कम से कम मेरी मशीन / सेटअप पर) की अवहेलना करेगा। आपको rgtk की स्क्रिप्ट का उपयोग करना होगा, लेकिन कृपया नीचे दिए गए वैकल्पिक फिल्टर भाग और sys.path.info को संशोधित करना सुनिश्चित करें:

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

(डेबियन / उबंटू) पायथन 3 के कुछ संस्करण (x) मानकर स्थापित किया गया है, फिर:

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

अपने अजगर के संस्करण को चलाने वाले ipython को लॉन्च करेगा।


1

मैं वर्षों बाद उम्मीद करता हूँ कि किसी को यह उपयोगी लगता है।

यह समाधान कुछ समस्याओं का हल करता है:

  • आपको वर्तमान वर्चुअलनेव में स्थापित iPython की आवश्यकता नहीं है, केवल वैश्विक Python के लिए जो आपके virtualenv के Python संस्करण ( 3.6 != 3.7) से मेल खाता है ।
  • pyenvआपके वैश्विक पायथन संस्करण के उपयोगकर्ताओं के लिए काम करता है 3.7और 3.6इसलिए आपका स्थानीय virtualenv पायथन इसलिए वैश्विक उपयोग कर रहा है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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.