निर्धारित करें कि पायथन virtualenv के अंदर चल रहा है या नहीं


272

क्या यह निर्धारित करना संभव है कि क्या वर्तमान स्क्रिप्ट वर्चुअन वातावरण में चल रही है?


2
जिज्ञासा से बाहर, आप यह क्यों जानना चाहेंगे?
जॉर्ज लीताओ

1
यानी कस्टम स्क्रिप्ट लिखने में सक्षम होने के लिए जो आपके शेल के लिए संकेत उत्पन्न करता है और आप चाहते हैं कि संकेत करने के लिए संकेत दें कि क्या आप वीवीवी में हैं या नहीं, इसलिए आप यह पता लगाने में सक्षम होना चाहते हैं कि कोड के भीतर से, सबसे अच्छा w / o कॉलिंग बाहरी उपकरण ।
मार्सिन ऑर्लोव्स्की

जवाबों:


227

AFAIK इसके लिए जांच करने का सबसे विश्वसनीय तरीका है (और जिस तरह से virtualenv और पाइप में आंतरिक रूप से उपयोग किया जाता है) के अस्तित्व की जांच करना है sys.real_prefix:

import sys

if hasattr(sys, 'real_prefix'):
    #...

एक virtualenv के अंदर, sys.prefixvirtualenv निर्देशिका के लिए अंक, और sys.real_prefixप्रणाली अजगर (अक्सर के 'असली' उपसर्ग के लिए अंक /usrया /usr/localया कुछ इस तरह)।

एक virtualenv के बाहर, sys.real_prefixमौजूद नहीं होना चाहिए।

VIRTUAL_ENVपर्यावरण चर का उपयोग करना विश्वसनीय नहीं है। यह virtualenv activateखोल स्क्रिप्ट द्वारा सेट किया गया है , लेकिन virtualenv का उपयोग सक्रियण के बिना किया जा सकता है सीधे virtualenv's bin/(या Scripts) निर्देशिका से निष्पादन योग्य चलाकर , जिस स्थिति में $VIRTUAL_ENVसेट नहीं किया जाएगा।


11
यह अब पायथन 3 में मान्य नहीं लगता है।
दान पी।

49
यदि आप virtualenv (github.com/pypa/virtualenv) का उपयोग कर रहे हैं, तो यह उत्तर Python 2 या Python 3 के लिए समान रूप से सही है। यदि आप pyvenv ( legacy.python.org/dev/beps/pep-0405 ) का उपयोग कर रहे हैं , तो virtualenv -स्थिर में बनाया गया पायथन 3.3+ (लेकिन वर्चुअनव के समान नहीं), फिर वह sys.real_prefix के बजाय sys.base_prefix का उपयोग करता है, और sys.base_prefix हमेशा मौजूद रहता है; पाइवेनव के बाहर यह sys.prefix के बराबर है।
कार्ल मेयर

2
@ Kounavi मुझे नहीं लगता कि इसकी संभावना है कि Windows संस्करण पर कोई प्रभाव पड़ेगा। यह जवाब किसी भी मंच पर virtualenv कैसे काम करता है का एक मुख्य हिस्सा है। क्या यह संभव है कि आप विंडोज 2012 मशीन पर पायथन 3 पायवेनव का उपयोग कर रहे हैं, वर्चुअनव नहीं? या कि PATH के साथ कुछ चल रहा है और आप वास्तव में virtualenv में नहीं चल रहे हैं जब आपको लगता है कि आप हैं?
कार्ल मेयर

3
बैश स्क्रिप्ट के लिए एक-लाइनरPYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
सैम मायर्स

2
यह उत्तर अप्रत्यक्ष रूप से अप्रचलित है । विशेष रूप से, यह उत्तर आम उपयोग के मामलों के लिए गलत नकारात्मक देता है। यह बुरी बात है। इसके बजाय, या तो देखें: सभी गैर-एनाकोंडा वेनों या विक्टोरिया स्टुअर्ट के आधिकारिक उत्तर का सही ढंग से पता लगाने वाले सभी एनाकोंडा वेनों का सही -सही पता लगाने में ह्रोनकॉक का आधिकारिक अद्यतन । ( मेरे सभी उत्थान जो भी उन दो उत्तरों को जोड़ते हैं। )
सेसिल करी

97

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 {} \+(चिंता न करें, वे स्वचालित रूप से पुनर्निर्माण करेंगे)।
jeremysprofile

मैंने इसे केवल पायथन 3.7 के साथ विंडोज 10 पर परीक्षण किया है। यह डिफ़ॉल्ट रूप से इंस्टॉल ...\lib\site-packagesमें पाइप के स्थान को प्रिंट करता है %PATH%। तो यह उस मामले में एक गलत सकारात्मक वापसी करेगा।
जेम्सटॉमस मून 1979

71

यह कार्ल मेयर द्वारा स्वीकृत उत्तर का सुधार है । यह पायथन 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 

4
चूंकि पायथन 3.3 अब अधिकांश पायथन 3 ढांचे और अनुप्रयोगों द्वारा बनाए या समर्थित नहीं है, इसलिए यह फ़ंक्शन अब एक तुच्छ वन-लाइनर के रूप में कम हो जाता है def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix:। मैं तो बस कह रहा हूं'।
सेसिल करी

अफसोस की बात यह है कि यह pipenvनिर्मित आभासी वातावरण के साथ काम नहीं करता है।
ड्रैगन 788

46

$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'

ये समान पर्यावरण चर जांच निश्चित रूप से पायथन लिपि के बाहर, शेल में भी की जा सकती हैं।


1
यह एक virtualenvvirtualenv और एक venvvirtualenv दोनों के लिए काम करता है ।
फ्लोरिसला

@verboze: जैसा कि यह करना है, है ना? एक निष्क्रिय वर्चुअनव का अर्थ है कि उपयोगकर्ता स्क्रिप्ट एक पर नहीं चल रही है।
MestreLion

यह जाँचता है कि एक virtualenv सक्रिय है, लेकिन इसका मतलब यह नहीं है कि पायथन प्रक्रिया चल रही है कि virtualenv से है।
एर

20

Http://www.python.org/dev/peps/pep-0405/#specification पर virtualenv पेप के अनुसार, आप केवल os.environ ['VIRTUAL_ENV') के बजाय sys.prefix का उपयोग कर सकते हैं।

sys.real_prefix मेरे virtualenv में मौजूद नहीं है और sys.base_prefix के साथ भी ऐसा ही है।


8
virtualenv स्टैंडअलोन प्रोजेक्ट है जो किसी भी पायथन संस्करण ( github.com/pypa/virtualenv ) पर काम करता है । आप जिस PEP से जुड़े हैं वह pyvenv के लिए है, जो virtualenv पर आधारित है लेकिन इसे अलग तरीके से (बेहतर) लागू किया गया है और यह Python 3.3+ में अंतर्निहित है। यह सवाल virtualenv के बारे में है, pyvenv के बारे में नहीं। तुम सही हो कि एक pyvenv में कोई नहीं है sys.real_prefix
कार्ल मेयर

5
इस उत्तर का उपयोग करके बैश से पता लगाने का एक अच्छा तरीका है: env |grep VIRTUAL_ENV |wc -l जो एक 1 अगर वेव में या 0 यदि नहीं तो लौटाएगा।
LISTERINE

3
आप एक खोल में हैं, तो आप बस का उपयोग कर सकते [[ -n $VIRTUAL_ENV ]] && echo virtualenvया [[ -z $VIRTUAL_ENV ]] && echo not virtualenvअपनी आवश्यकताओं पर निर्भर करता है।
छह

9

यह जांचने के लिए कि क्या आपके अंदर 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")}')

1
यह सबसे अच्छा क्रॉस-प्लेटफॉर्म (विंडोज / यूनिक्स) दृष्टिकोण है।
आदि उन्नीथन

अब तक, यह केवल क्रॉस प्लेटफॉर्म, अजगर 2 और अजगर 3 संगत तरीका है। धन्यवाद।
RJ

9

यहाँ कई अच्छे उत्तर हैं, और कुछ कम मजबूत हैं। यहाँ एक सिंहावलोकन है।

कैसे नहीं करना है

पायथन या 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

एनाकोंडा

यदि आप एनाकोंडा आभासी वातावरण का उपयोग कर रहे हैं, तो विक्टोरिया स्टुअर्ट के उत्तर की जांच करें ।


ओपी पूछ रहा है "मैं कैसे करूँ?", "कैसे नहीं?" यह उत्तर ओवरकिल है। यह प्रश्न की भावना से परे है और बहुत अधिक विविधताओं के साथ उत्तर को बाधित करता है। कृपया अपने उत्तरों को यथासंभव सरल रखें और सीधे प्रश्न का उत्तर दें।
रिच लिसाकोव्स्की पीएचडी

मैं यहां कई उत्तरों को संक्षेप में प्रस्तुत कर रहा हूं और सलाह दे रहा हूं कि कोई व्यक्ति विशेष परिस्थितियों के लिए सही हो सकता है। मूल प्रश्न इन तकनीकों में से किसी एक को 'सर्वश्रेष्ठ' के रूप में चुनने के लिए पर्याप्त संदर्भ प्रदान नहीं करता है - यह सिर्फ इतना आसान नहीं है।
फ्लोरिसला

1
Sys.base_prefix के अनुभाग में, परीक्षण नहीं होना चाहिए:running_in_virtualenv = sys.*base_*prefix != sys.prefix
usonianhorizon

@usonianhorizon सच, धन्यवाद!
फ्लोरिसला

धन्यवाद, @florisia! मैं आवेदन की तैनाती के लिए बिल्ट-इन वेन में virtualenvwrapper से संक्रमण की प्रक्रिया में हूं, और आपकी व्याख्या ने मुझे यह करने के लिए टेम्पलेट दिया। मैं केवल if hasattr(sys, 'real_prefix'):परीक्षण पर भरोसा कर रहा था , जो अब काम नहीं करता था।
usonianhorizon

8

आप कर सकते हैं which pythonऔर देखते हैं कि आभासी एनवी में इसकी ओर इशारा करते हैं या नहीं।


1
whichविंडोज पर डिफ़ॉल्ट रूप से उपलब्ध नहीं है। आप whereइसके बजाय विंडोज पर उपयोग कर सकते हैं , या किस आरपीजी को नियोजित कर सकते हैं । या देखो sys.executable। लेकिन फिर भी, बेहतर तरीके हैं।
फ्लोरिसला

5
  • अद्यतन नवंबर 2019 (जोड़ा गया)।

मैं नियमित रूप से कई एनाकोंडा-स्थापित आभासी वातावरण (वेनव) का उपयोग करता हूं। यह कोड स्निपेट / उदाहरण आपको यह निर्धारित करने में सक्षम करता है कि आप एक वेव (या आपके सिस्टम वातावरण) में हैं या नहीं, और आपकी स्क्रिप्ट के लिए एक विशिष्ट वेनव की भी आवश्यकता है।

पायथन लिपि में जोड़ें (कोड स्निपेट):

# ----------------------------------------------------------------------------
# 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!  :-)
>>> 

3

सबसे आसान तरीका बस चलाना है: which pythonयदि आप एक virtualenv में हैं, तो यह वैश्विक के बजाय इसके अजगर को इंगित करेगा


1
मुझे नहीं लगता कि यह वास्तव में सवाल का जवाब देता है (जो "वर्तमान स्क्रिप्ट" के बारे में चिंतित है)। हालाँकि यह मेरे विशेष प्रश्न का उत्तर देता है, "मुझे कैसे पता चलेगा कि मैं कमांड लाइन से आभासी वातावरण में हूँ।"
उक्रत

1

(संपादित) मैंने इस तरह से पाया, आप इसके बारे में क्या सोचते हैं? (यह भी 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'] + '/../')

0

यहां पहले से ही बहुत सारे शानदार तरीके पोस्ट किए गए हैं, लेकिन सिर्फ एक और जोड़ने के लिए:

import site
site.getsitepackages()

आपको बताता pipहै कि संकुल कहाँ स्थापित किया गया है।


यह नहीं बताता है कि पायथन आभासी वातावरण के अंदर चल रहा है या नहीं।
फ्लोरिसला

@florisla क्या आप विस्तृत कर सकते हैं? यदि site.getsitepackages()एक निर्देशिका को आउटपुट करता है जो सिस्टम एक नहीं है, तो आप वर्चुअल वातावरण में कटौती कर सकते हैं।
flow2k

आप कई स्थानों पर पायथन स्थापित कर सकते हैं। उदाहरण के लिए, विंडोज पर आप एक 'सिस्टम' पायथन और एक WinPython वितरण और एक कॉनडा-आधारित पायथन स्थापित कर सकते हैं। ये सभी अलग साइट-संकुल फ़ोल्डर लेकिन जरूरी द्वारा एक बनाए गए (या में प्रयुक्त) नहीं कर रहे हैं virtualenv
फ्लोरिसला

@florisla अच्छा बिंदु - मैंने सिर्फ यह देखा (वेनव या नहीं) यह वही है जो सवाल पूछ रहा है (मैंने दूसरे प्रश्न के लिए इसी तरह का उत्तर लिखा था)। मैं मानता हूं कि यह निश्चित रूप से जवाब नहीं दे सकता है कि आप वीवी में हैं या नहीं, लेकिन आपको यह बताने में मदद कर सकते हैं कि आप किस पायथन venvका उपयोग कर रहे हैं।
flow2k

-1

यह बुलेट-प्रूफ नहीं है, लेकिन यूनिक्स वातावरण जैसे सरल परीक्षण के लिए है

if run("which python3").find("venv") == -1:
    # something when not executed from venv

मेरे लिए बहुत अच्छा काम करता है। यह सरल है तो कुछ विशेषता के मौजूदा परीक्षण और, वैसे भी, आपको अपनी वेव निर्देशिका का नाम देना चाहिए venv


-1

विंडोज़ ओएस में आप कुछ इस तरह देखते हैं:

C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>

कोष्ठक का अर्थ है कि आप वास्तव में "virtualEnvName" नामक आभासी वातावरण में हैं।


आप और मैं 'virtualEnvName' को ठीक-ठीक पढ़ सकते हैं। लेकिन सवाल यह है कि एक पायथन मॉड्यूल इसे कैसे पढ़ सकता है।
फ्लोरिसला

-1

एक संभावित समाधान है:

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'])

-1

यह एक पुराना प्रश्न है, लेकिन ऊपर दिए गए कई उदाहरण अति-जटिल हैं।

इसे सरल रखें: (विंडोज 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
फ्लोरिसला

फ्लोरिसला, आपने अपना जवाब "यह कैसे नहीं करना है" प्रदान किया लगभग 3 महीने बाद मैंने एक जवाब प्रदान किया जो मेरे लिए सीमा के भीतर काम करता है (मैं वर्चुअन और पिपेनव के बीच नहीं चलता हूं)। अपने खुद के लुक को बेहतर बनाने के लिए अन्य लोगों के उत्तरों को कम करना बुरा खेल है।
रिच लिसाकोव्स्की पीएचडी

अमीर, आपके लिए जो काम करता है वह दूसरे लोगों के लिए काम नहीं कर सकता है। यह मूल पोस्टर के लिए भी काम नहीं कर सकता है।
फ्लोरिसला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.