क्या यह निर्धारित करना संभव है कि क्या वर्तमान स्क्रिप्ट वर्चुअन वातावरण में चल रही है?
क्या यह निर्धारित करना संभव है कि क्या वर्तमान स्क्रिप्ट वर्चुअन वातावरण में चल रही है?
जवाबों:
AFAIK इसके लिए जांच करने का सबसे विश्वसनीय तरीका है (और जिस तरह से virtualenv और पाइप में आंतरिक रूप से उपयोग किया जाता है) के अस्तित्व की जांच करना है sys.real_prefix
:
import sys
if hasattr(sys, 'real_prefix'):
#...
एक virtualenv के अंदर, sys.prefix
virtualenv निर्देशिका के लिए अंक, और sys.real_prefix
प्रणाली अजगर (अक्सर के 'असली' उपसर्ग के लिए अंक /usr
या /usr/local
या कुछ इस तरह)।
एक virtualenv के बाहर, sys.real_prefix
मौजूद नहीं होना चाहिए।
VIRTUAL_ENV
पर्यावरण चर का उपयोग करना विश्वसनीय नहीं है। यह virtualenv activate
खोल स्क्रिप्ट द्वारा सेट किया गया है , लेकिन virtualenv का उपयोग सक्रियण के बिना किया जा सकता है सीधे virtualenv's bin/
(या Scripts
) निर्देशिका से निष्पादन योग्य चलाकर , जिस स्थिति में $VIRTUAL_ENV
सेट नहीं किया जाएगा।
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
pip -V
(नोटिस राजधानी वी) का उपयोग करने का प्रयास करें
यदि आप वर्चुअल एनवी चला रहे हैं। यह एनवी के स्थान को रास्ता दिखाएगा।
virtualenv
बहुत कुछ घुमा लिया है , तो संभव है कि यह विफल हो सकता है या आपसे झूठ बोल सकता है। यदि यह झूठ बोल रहा है, तो आप कर सकते हैं find /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
। यदि यह विफल हो रहा है (मुझे "खराब मार्शल डेटा मिला है") तो आपको .pyc फ़ाइलों को मिटा देना होगा find /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(चिंता न करें, वे स्वचालित रूप से पुनर्निर्माण करेंगे)।
...\lib\site-packages
में पाइप के स्थान को प्रिंट करता है %PATH%
। तो यह उस मामले में एक गलत सकारात्मक वापसी करेगा।
यह कार्ल मेयर द्वारा स्वीकृत उत्तर का सुधार है । यह पायथन 3 और 2 के लिए virtualenv के साथ काम करता है और पायथन 3 में वेनव मॉड्यूल के लिए भी :
import sys
def is_venv():
return (hasattr(sys, 'real_prefix') or
(hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix))
वर्चुअन कवर के लिए चेक sys.real_prefix
, गैर-खाली की समानता के sys.base_prefix
साथ sys.prefix
कवर वेनव।
एक स्क्रिप्ट पर विचार करें जो इस तरह फ़ंक्शन का उपयोग करती है:
if is_venv():
print('inside virtualenv or venv')
else:
print('outside virtualenv or venv')
और निम्नलिखित आह्वान:
$ python2 test.py
outside virtualenv or venv
$ python3 test.py
outside virtualenv or venv
$ python2 -m virtualenv virtualenv2
...
$ . virtualenv2/bin/activate
(virtualenv2) $ python test.py
inside virtualenv or venv
(virtualenv2) $ deactivate
$ python3 -m virtualenv virtualenv3
...
$ . virtualenv3/bin/activate
(virtualenv3) $ python test.py
inside virtualenv or venv
(virtualenv3) $ deactivate
$ python3 -m venv venv3
$ . venv3/bin/activate
(venv3) $ python test.py
inside virtualenv or venv
(venv3) $ deactivate
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
:। मैं तो बस कह रहा हूं'।
pipenv
निर्मित आभासी वातावरण के साथ काम नहीं करता है।
$VIRTUAL_ENV
पर्यावरण चर की जाँच करें ।
$VIRTUAL_ENV
वातावरण चर एक सक्रिय आभासी वातावरण में आभासी पर्यावरण की निर्देशिका जब होता है।
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
एक बार जब आप deactivate
वर्चुअल वातावरण को चलाते / छोड़ते हैं, तो $VIRTUAL_ENV
चर साफ़ / खाली हो जाएगा। पाइथन उठाएगा KeyError
क्योंकि पर्यावरण चर अप्रभावित था।
>>> import os
>>> os.environ['VIRTUAL_ENV']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'
ये समान पर्यावरण चर जांच निश्चित रूप से पायथन लिपि के बाहर, शेल में भी की जा सकती हैं।
virtualenv
virtualenv और एक venv
virtualenv दोनों के लिए काम करता है ।
Http://www.python.org/dev/peps/pep-0405/#specification पर virtualenv पेप के अनुसार, आप केवल os.environ ['VIRTUAL_ENV') के बजाय sys.prefix का उपयोग कर सकते हैं।
sys.real_prefix मेरे virtualenv में मौजूद नहीं है और sys.base_prefix के साथ भी ऐसा ही है।
sys.real_prefix
।
env |grep VIRTUAL_ENV |wc -l
जो एक 1 अगर वेव में या 0 यदि नहीं तो लौटाएगा।
[[ -n $VIRTUAL_ENV ]] && echo virtualenv
या [[ -z $VIRTUAL_ENV ]] && echo not virtualenv
अपनी आवश्यकताओं पर निर्भर करता है।
यह जांचने के लिए कि क्या आपके अंदर Virtualenv:
import os
if os.getenv('VIRTUAL_ENV'):
print('Using Virtualenv')
else:
print('Not using Virtualenv')
आप अपने पर्यावरण पर अधिक डेटा भी प्राप्त कर सकते हैं:
import sys
import os
print(f'Python Executable: {sys.executable}')
print(f'Python Version: {sys.version}')
print(f'Virtualenv: {os.getenv("VIRTUAL_ENV")}')
यहाँ कई अच्छे उत्तर हैं, और कुछ कम मजबूत हैं। यहाँ एक सिंहावलोकन है।
पायथन या site-packages
फ़ोल्डर के स्थान पर भरोसा न करें ।
यदि ये गैर-मानक स्थानों पर सेट हैं, तो इसका मतलब यह नहीं है कि आप वास्तव में एक आभासी वातावरण में हैं। उपयोगकर्ताओं के पास एक से अधिक पायथन संस्करण स्थापित हो सकते हैं, और वे हमेशा नहीं होते हैं जहाँ आप उनसे अपेक्षा करते हैं।
देखने से बचें:
sys.executable
sys.prefix
pip -V
which python
इसके अलावा, की उपस्थिति की जांच नहीं करते हैं venv
, .venv
या envs
इन रास्तों में से किसी में। यह अधिक विशिष्ट स्थान वाले वातावरण के लिए टूट जाएगा। उदाहरण के लिए,
पिपेनव अपने वातावरण के नाम के रूप में हैश मूल्यों का उपयोग करता है।
VIRTUAL_ENV
वातावरण विविधतादोनों virtualenv
और venv
पर्यावरण चर सेट $VIRTUAL_ENV
जब एक वातावरण को सक्रिय। पीईपी 405 देखें ।
आप शेल चर स्क्रिप्ट में इस चर को पढ़ सकते हैं, या यह निर्धारित करने के लिए इस पायथन कोड का उपयोग कर सकते हैं।
import os
running_in_virtualenv = "VIRTUAL_ENV" in os.environ
# alternative ways to write this, also supporting the case where
# the variable is set but contains an empty string to indicate
# 'not in a virtual environment':
running_in_virtualenv = bool(os.environ.get("VIRTUAL_ENV"))
running_in_virtualenv = bool(os.getenv("VIRTUAL_ENV"))
समस्या यह है कि यह केवल तभी काम करता है जब शेल स्क्रिप्ट द्वारा पर्यावरण को सक्रिय किया जाता है activate
।
आप पर्यावरण को सक्रिय किए बिना पर्यावरण की स्क्रिप्ट शुरू कर सकते हैं , इसलिए यदि यह चिंता का विषय है, तो आपको एक अलग विधि का उपयोग करना होगा।
sys.base_prefix
virtualenv
, venv
और आप की उम्मीद के रूप में virtualenv के अंदर स्थापित पायथन को pyvenv
इंगित sys.prefix
करें।
इसी समय, का मूल मूल्य sys.prefix
भी उपलब्ध कराया गया है sys.base_prefix
।
अगर हम एक virtualenv में कर रहे हैं पता लगाने के लिए हम इसका उपयोग कर सकते हैं।
import sys
# note: Python versions before 3.3 don't have sys.base_prefix
# if you're not in virtual environment
running_in_virtualenv = sys.prefix != sys.base_prefix
sys.real_prefix
अब देखें, virtualenv
इससे पहले कि संस्करण 20 सेट नहीं किया गया था, sys.base_prefix
बल्कि इसके sys.real_prefix
बजाय सेट किया गया था।
इसलिए सुरक्षित होने के लिए, दोनों को ह्रोनोक के उत्तर में सुझाए गए तरीके से जांचें :
import sys
real_prefix = getattr(sys, "real_prefix", None)
base_prefix = getattr(sys, "base_prefix", sys.prefix)
running_in_virtualenv = (base_prefix or real_prefix) != sys.prefix
यदि आप एनाकोंडा आभासी वातावरण का उपयोग कर रहे हैं, तो विक्टोरिया स्टुअर्ट के उत्तर की जांच करें ।
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
परीक्षण पर भरोसा कर रहा था , जो अब काम नहीं करता था।
आप कर सकते हैं which python
और देखते हैं कि आभासी एनवी में इसकी ओर इशारा करते हैं या नहीं।
which
विंडोज पर डिफ़ॉल्ट रूप से उपलब्ध नहीं है। आप where
इसके बजाय विंडोज पर उपयोग कर सकते हैं , या किस आरपीजी को नियोजित कर सकते हैं । या देखो sys.executable
। लेकिन फिर भी, बेहतर तरीके हैं।
मैं नियमित रूप से कई एनाकोंडा-स्थापित आभासी वातावरण (वेनव) का उपयोग करता हूं। यह कोड स्निपेट / उदाहरण आपको यह निर्धारित करने में सक्षम करता है कि आप एक वेव (या आपके सिस्टम वातावरण) में हैं या नहीं, और आपकी स्क्रिप्ट के लिए एक विशिष्ट वेनव की भी आवश्यकता है।
पायथन लिपि में जोड़ें (कोड स्निपेट):
# ----------------------------------------------------------------------------
# Want script to run in Python 3.5 (has required installed OpenCV, imutils, ... packages):
import os
# First, see if we are in a conda venv { py27: Python 2.7 | py35: Python 3.5 | tf: TensorFlow | thee : Theano }
try:
os.environ["CONDA_DEFAULT_ENV"]
except KeyError:
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# If we are in a conda venv, require the p3 venv:
if os.environ['CONDA_DEFAULT_ENV'] != "py35":
print("\tPlease set the py35 { p3 | Python 3.5 } environment!\n")
exit()
# See also:
# Python: Determine if running inside virtualenv
# http://stackoverflow.com/questions/1871549/python-determine-if-running-inside-virtualenv
# [ ... SNIP! ... ]
उदाहरण:
$ p2
[Anaconda Python 2.7 venv (source activate py27)]
(py27) $ python webcam_.py
Please set the py35 { p3 | Python 3.5 } environment!
(py27) $ p3
[Anaconda Python 3.5 venv (source activate py35)]
(py35) $ python webcam.py -n50
current env: py35
processing (live): found 2 faces and 4 eyes in this frame
threaded OpenCV implementation
num_frames: 50
webcam -- approx. FPS: 18.59
Found 2 faces and 4 eyes!
(py35) $
अपडेट 1 - बैश स्क्रिप्ट में उपयोग करें:
आप बैश स्क्रिप्ट में भी इस दृष्टिकोण का उपयोग कर सकते हैं (उदाहरण के लिए, जो एक विशिष्ट आभासी वातावरण में चलना चाहिए)। उदाहरण (बैश स्क्रिप्ट में जोड़ा गया):
if [ $CONDA_DEFAULT_ENV ] ## << note the spaces (important in BASH)!
then
printf 'venv: operating in tf-env, proceed ...'
else
printf 'Note: must run this script in tf-env venv'
exit
fi
अपडेट 2 [नवंबर 2019]
अपने मूल पोस्ट के बाद से मैं एनाकोंडा वेनव (और पायथन में ही viz-a-viz आभासी वातावरण विकसित हुआ है) से आगे बढ़ा हूँ ।
इस समस्या को फिर से प्रकाशित करते हुए, यहां कुछ अपडेट किया गया पायथन कोड है जिसे आप यह जांचने के लिए सम्मिलित कर सकते हैं कि आप एक विशिष्ट पायथन वर्चुअल वातावरण (वेनव) में काम कर रहे हैं।
import os, re
try:
if re.search('py37', os.environ['VIRTUAL_ENV']):
pass
except KeyError:
print("\n\tPlease set the Python3 venv [alias: p3]!\n")
exit()
यहाँ कुछ व्याख्यात्मक कोड दिया गया है।
[victoria@victoria ~]$ date; python --version
Thu 14 Nov 2019 11:27:02 AM PST
Python 3.8.0
[victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> re.search('py37', os.environ['VIRTUAL_ENV'])
<re.Match object; span=(20, 24), match='py37'>
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Please set the Python3 venv [alias: p3]!
>>> [Ctrl-d]
now exiting EditableBufferInteractiveConsole...
[victoria@victoria ~]$ p3
[Python 3.7 venv (source activate py37)]
(py37) [victoria@victoria ~]$ python --version
Python 3.8.0
(py37) [victoria@victoria ~]$ env | grep -i virtual
VIRTUAL_ENV=/home/victoria/venv/py37
(py37) [victoria@victoria ~]$ python
Python 3.8.0 (default, Oct 23 2019, 18:51:26)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, re
>>> try:
... if re.search('py37', os.environ['VIRTUAL_ENV']):
... print('\n\tOperating in Python3 venv, please proceed! :-)')
... except KeyError:
... print("\n\tPlease set the Python3 venv [alias: p3]!\n")
...
Operating in Python3 venv, please proceed! :-)
>>>
सबसे आसान तरीका बस चलाना है: which python
यदि आप एक virtualenv में हैं, तो यह वैश्विक के बजाय इसके अजगर को इंगित करेगा
(संपादित) मैंने इस तरह से पाया, आप इसके बारे में क्या सोचते हैं? (यह भी venv आधार पथ वापस आती है और के लिए भी काम करता है readthedocs जहां जाँच env चर नहीं करता है):
import os
import sys
from distutils.sysconfig import get_config_vars
def get_venv_basedir():
"""Returns the base directory of the virtualenv, useful to read configuration and plugins"""
exec_prefix = get_config_vars()['exec_prefix']
if hasattr(sys, 'real_prefix') is False or exec_prefix.startswith(sys.real_prefix):
raise EnvironmentError('You must be in a virtual environment')
return os.path.abspath(get_config_vars()['exec_prefix'] + '/../')
यहां पहले से ही बहुत सारे शानदार तरीके पोस्ट किए गए हैं, लेकिन सिर्फ एक और जोड़ने के लिए:
import site
site.getsitepackages()
आपको बताता pip
है कि संकुल कहाँ स्थापित किया गया है।
site.getsitepackages()
एक निर्देशिका को आउटपुट करता है जो सिस्टम एक नहीं है, तो आप वर्चुअल वातावरण में कटौती कर सकते हैं।
virtualenv
।
venv
का उपयोग कर रहे हैं।
यह बुलेट-प्रूफ नहीं है, लेकिन यूनिक्स वातावरण जैसे सरल परीक्षण के लिए है
if run("which python3").find("venv") == -1:
# something when not executed from venv
मेरे लिए बहुत अच्छा काम करता है। यह सरल है तो कुछ विशेषता के मौजूदा परीक्षण और, वैसे भी, आपको अपनी वेव निर्देशिका का नाम देना चाहिए venv
।
विंडोज़ ओएस में आप कुछ इस तरह देखते हैं:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
कोष्ठक का अर्थ है कि आप वास्तव में "virtualEnvName" नामक आभासी वातावरण में हैं।
एक संभावित समाधान है:
os.access(sys.executable, os.W_OK)
मेरे मामले में मैं वास्तव में यह पता लगाना चाहता था कि क्या मैं पाइप के साथ आइटम स्थापित कर सकता हूं। हालांकि यह सभी मामलों के लिए सही समाधान नहीं हो सकता है, बस जाँच करें कि क्या आपने पायथन निष्पादन योग्य के स्थान के लिए अनुमतियाँ लिखी हैं।
नोट: यह पायथन के सभी संस्करणों में काम करता है, लेकिन True
अगर आप सिस्टम पायथन को चलाते हैं तो यह भी वापस आ जाता है sudo
। यहाँ एक संभावित उपयोग का मामला है:
import os, sys
can_install_pip_packages = os.access(sys.executable, os.W_OK)
if can_install_pip_packages:
import pip
pip.main(['install', 'mypackage'])
यह एक पुराना प्रश्न है, लेकिन ऊपर दिए गए कई उदाहरण अति-जटिल हैं।
इसे सरल रखें: (विंडोज 10 पर जुपिटर नोटबुक या अजगर 3.7.1 टर्मिनल में)
import sys
print(sys.executable)```
# example output: >> `C:\Anaconda3\envs\quantecon\python.exe`
OR
```sys.base_prefix```
# Example output: >> 'C:\\Anaconda3\\envs\\quantecon'
envs
उस मार्ग की उपस्थिति के लिए जांच करने के लिए तर्क जोड़ते हैं , तो एनाकोंडा से virtualenv
या में जाने पर यह काम करना बंद कर देगा pipenv
।