मैंने अपने उबंटू 16.04 वीपीएस पर लिनक्सब्रू (होमब्रू 2.2.5) का उपयोग करके pyenv-virtualenv स्थापित किया। पाइएनव संस्करण है: 1.2.16। अब जब मैं इस तरह एक परीक्षण करता हूं:

pyenv install 3.8.1
pyenv virtualenv 3.8.1 test
cd /.pyenv/versions/3.8.1/envs/test
pyenv local 3.8.1

फिर /.pyenv/versions/3.8.1/envs/test में प्रवेश करने/छोड़ने से वर्चुअल वातावरण निष्क्रिय नहीं होता है और मुझे अपने शेल में (test) username:~ दिखाई नहीं देता है। मैंने वहां एक /home/users/test निर्देशिका और .python-version भी बनाई लेकिन फिर भी निर्देशिका में प्रवेश/छोड़ने से कुछ नहीं होता है।

दस्तावेज़ीकरण के अनुसार:

यदि eval "$(pyenv virtualenv-init -)" आपके शेल में कॉन्फ़िगर किया गया है, तो pyenv-virtualenv स्वचालित रूप से वर्चुअलएन्व्स को सक्रिय/निष्क्रिय कर देगा जिसमें निर्देशिकाओं में प्रवेश करने/छोड़ने पर एक .python-संस्करण फ़ाइल होती है जिसमें एक वैध वर्चुअल वातावरण का नाम होता है pyenv virtualenvs के आउटपुट में दिखाया गया है (उदाहरण के लिए, venv34 या 3.4.3/envs/venv34 ऊपर उदाहरण में)। .python-संस्करण फ़ाइलों का उपयोग pyenv द्वारा स्थानीय पायथन संस्करणों को दर्शाने के लिए किया जाता है और इसे pyenv स्थानीय कमांड के साथ बनाया और हटाया जा सकता है।


तो पहला सवाल है: यह काम क्यों नहीं करता? .python-version फ़ाइल वाली निर्देशिका में प्रवेश करने/छोड़ने पर वर्चुअल वातावरण स्वचालित रूप से सक्रिय/निष्क्रिय क्यों नहीं होता है?

साथ ही जब मैं वर्चुअलएन्व को हाथ से सक्रिय करता हूं pyenv activate test और फिर पायथन संस्करण की जांच करता हूं, तो यह सिस्टम पायथन संस्करण को प्रिंट करता है, न कि पर्यावरण से: Python 3.8.1:

python --version
Python 3.7.6

मैं सीधे वर्चुअलएन्व शिम्स पायथन को इस तरह संदर्भित करके सही पायथन संस्करण प्राप्त कर सकता हूं:

which python
/home/andre/.pyenv/shims/python
/home/andre/.pyenv/shims/python --version
Python 3.8.1

जब भी वर्चुअलएन्व "टेस्ट" सक्रिय होता है या नहीं, व्यवहार वही होता है। मुझे उम्मीद है कि "परीक्षण" को सक्रिय करने के बाद कमांड python --version वापस Python 3.8.1

तो दूसरा प्रश्न: आभासी वातावरण को सक्रिय/निष्क्रिय करते समय pip और python स्विच क्यों नहीं किए जाते ?

क्या ये पायनेव बग हैं? या मुझ से कुछ गलत हो रहा है?

5
Tony 13 फरवरी 2020, 19:37

1 उत्तर

सबसे बढ़िया उत्तर

यह पता चला है कि किसी निर्देशिका में प्रवेश करते/छोड़ते समय venv को स्वचालित रूप से सक्रिय/निष्क्रिय करने के लिए .python-version फ़ाइल में venv name होना चाहिए न कि Python version से संबद्ध वह venv

तो क्रियान्वित: pyenv local 3.8.1 एक .python-version फ़ाइल बनाता है जिसमें केवल पायथन संस्करण 3.8.1 शामिल है। फिर .python-version फ़ाइल वाली निर्देशिका में प्रवेश करना/छोड़ना उस फ़ाइल में निर्दिष्ट पायथन संस्करण को सेट/अनसेट कर देगा लेकिन किसी भी venv को सक्रिय/निष्क्रिय नहीं करेगा।

एक .python-version फ़ाइल बनाने के लिए जो दोनों काम करेगी: एक आभासी वातावरण को सक्रिय करें और पायथन संस्करण को सेट करें, कमांड को इस तरह दिखना चाहिए: pyenv local test जहां test के साथ बनाया गया एक venv है: pyenv virtualenv 3.8.1 test.

इसलिए 3.8.1 को test में .python-version में बदलने से समस्या ठीक हो गई। मेरे द्वारा ऐसा करने के बाद .python-version वाली निर्देशिका में प्रवेश/छोड़ते समय venv सक्रिय/निष्क्रिय हो गया था।

लेकिन फिर भी पायथन संस्करण venv (इस मामले में 3.8.1) से जुड़े संस्करण में नहीं बदला।

तब मुझे पता चला कि मेरे .profile में दो लाइनें हैं जो इस समस्या का कारण बन रही हैं:

alias python=/home/linuxbrew/.linuxbrew/bin/python3
alias pip=/home/linuxbrew/.linuxbrew/bin/pip3

इन पंक्तियों को हटाने के बाद सब कुछ उम्मीद के मुताबिक काम करता है।

3
Tony 31 मई 2020, 04:25
आप इस समाधान के साथ कैसे आए? क्या यह प्रायोगिक है या आपको कहीं और pyenv इंटर्नल के बारे में जानकारी का कुछ अच्छा स्रोत मिला है? मेरा मतलब है कि pyenv बहुत अच्छा है लेकिन आधिकारिक दस्तावेज़ निम्न स्तर के विवरण के बारे में कुछ अस्पष्ट हैं।
 – 
jetpack_guy
6 जुलाई 2020, 22:05
पहले अंक के लिए मैं थोड़ा इधर-उधर पूछ रहा था ... मुझे लगता है कि यह कई लोगों के लिए भ्रमित करने वाला है क्योंकि .python-version का सुझाव है कि इसमें पायथन संस्करण शामिल है, लेकिन वास्तव में इसमें आभासी वातावरण का नाम होना चाहिए (जो वास्तव में स्पष्ट रूप से कहा गया है) दस्तावेज़, लेकिन फिर भी मैंने यह गलती की...) दूसरी समस्या मेरे कारण हुई।
 – 
Tony
7 जुलाई 2020, 02:30
धन्यवाद! मैं इसका कभी पता नहीं लगा पाता क्योंकि pyenv local --help, Usage: pyenv local <version> <version2> <..> लौटाता है। यह इतना बहुत धोखा है।
 – 
Bruno Bronosky
6 नवम्बर 2020, 08:40