পাইথনটি ভার্চুয়ালেনভের অভ্যন্তরে চলছে কিনা তা নির্ধারণ করুন


272

বর্তমান স্ক্রিপ্টটি কোনও ভার্চুয়ালেনভ পরিবেশের মধ্যে চলছে কিনা তা নির্ধারণ করা সম্ভব?


2
কৌতূহলের বাইরে আপনি কেন এটি জানতে চান?
জর্জি লিটাও

1
অর্থাত্ আপনার শেলটির জন্য প্রম্পট তৈরি করে এমন কাস্টম স্ক্রিপ্ট লিখতে সক্ষম হবেন এবং আপনি যদি অনুরোধ করতে চান যে আপনি ভেন্টে আছেন বা না, তাই আপনি সেই কোডের মধ্যে থেকে এটি সনাক্ত করতে সক্ষম হতে চান, সেরা ডাব্লু / ও বহিরাগত সরঞ্জামগুলি কল করছে ।
মার্সিন ওরোলোস্কি

উত্তর:


227

এএফআইএকে এটি পরীক্ষা করার সবচেয়ে নির্ভরযোগ্য উপায় (এবং যে উপায়ে অভ্যন্তরীণভাবে ভার্চুয়ালেনভ এবং পাইপে ব্যবহৃত হয়) তা হল অস্তিত্বের জন্য যাচাই করা sys.real_prefix:

import sys

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

একটি virtualenv ভিতরে, sys.prefixvirtualenv নির্দেশিকাতে পয়েন্ট, এবং sys.real_prefixসিস্টেম পাইথন (প্রায়ই এর "বাস্তব" উপসর্গ পয়েন্ট /usrবা /usr/localবা কিছু যেমন)।

একটি ভার্চুয়ালেনভের বাইরে sys.real_prefixথাকা উচিত নয়।

VIRTUAL_ENVপরিবেশের পরিবর্তনশীল ব্যবহার নির্ভরযোগ্য নয়। এটি ভার্চুয়ালেনভ activateশেল স্ক্রিপ্ট দ্বারা সেট করা হয়েছে , তবে ভার্চুয়ালেনভ bin/(বা Scripts) ডিরেক্টরি থেকে সরাসরি এক্সিকিউটেবল চালিয়ে অ্যাক্টিভেশন ছাড়াই একটি ভার্চুয়ালেনভ ব্যবহার করা যেতে পারে , যার ক্ষেত্রে $VIRTUAL_ENVসেট করা হবে না।


11
এটি আর পাইথন 3 এ বৈধ বলে মনে হচ্ছে না।
ড্যান পি।

49
আপনি virtualenv (github.com/pypa/virtualenv) ব্যবহার করে থাকেন, এই উত্তর পাইথন 2 বা পাইথন 3 pyvenv ব্যবহার করে থাকেন (জন্য সমানভাবে সঠিক legacy.python.org/dev/peps/pep-0405 ), একটি virtualenv -পাইথন ৩.৩++ তে নির্মিত (তবে ভার্চুয়ালেনভের মতো একই জিনিস নয়), তবে এটি sys.real_prefix এর পরিবর্তে sys.base_prefix ব্যবহার করে এবং sys.base_prefix সর্বদা উপস্থিত থাকে; একটি পাইভেনভের বাইরে এটি sys.prefix এর সমান।
কার্ল মেয়ার

2
@ কাউনাভি আমি উইন্ডোজ সংস্করণটির কোনও প্রভাব ফেলবে বলে মনে করি না। এই উত্তরটি কোনও প্ল্যাটফর্মে ভার্চুয়ালেনভ কীভাবে কাজ করে তার মূল অংশ। উইন্ডোজ ২০১২ মেশিনে আপনি কি পাইথন 3 পাইভেনভ ব্যবহার করছেন, ভার্চুয়ালেনভ নয়? বা যে পথের সাথে কিছু চলছে এবং আপনি যখন ভেবেছেন যে আপনি আসলে ভার্চুয়ালেনভে চলছে না?
কার্ল মেয়ার

3
বাশ স্ক্রিপ্টগুলির জন্য ওয়ান-লাইনারPYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
স্যাম মায়ার্স

2
এই উত্তরটি অচল, আশ্চর্যজনক নয়। বিশেষত, এই উত্তরটি সাধারণ ব্যবহারের ক্ষেত্রে মিথ্যা নেতিবাচক প্রতিক্রিয়া দেয়। এটা খারাপ. : তার জন্যে, হয় দেখতে hroncok এর প্রামাণিক আপডেট সঠিকভাবে সমস্ত অ-Anaconda দ্বারা সনাক্ত venvs বা ভিক্টোরিয়া স্টুয়ার্ট এর প্রামাণিক উত্তর সঠিকভাবে সব Anaconda দ্বারা সনাক্ত venvs । ( যে কেহ এর জন্য সকল আমার upvotes ঐ দুই উত্তর সম্মিলন। )
সিসিল কারি

97

ব্যবহার করার চেষ্টা করুন pip -V(নোটিশ মূলধন ভি)

আপনি যদি ভার্চুয়াল env চালাচ্ছেন। এটি env. এর অবস্থানের পথ দেখাবে show


আপনি যদি আপনার 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 {} \+হবে (চিন্তা করবেন না, তারা স্বয়ংক্রিয়ভাবে পুনর্নির্মাণ করবে)।
জেরেমিসপ্রোফাইল

আমি উইন্ডোজ 10 এ পাইথন 3.7 দিয়ে সবেমাত্র এটি পরীক্ষা করেছি। এটি ডিফল্ট ইনস্টল থেকে পাইপের অবস্থান মুদ্রণ ...\lib\site-packagesকরে %PATH%। সুতরাং এটি সেই ক্ষেত্রে একটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করবে।
জেমস থমাসমুন 1979

71

এটি কার্ল মেয়ারের গৃহীত উত্তরের একটি উন্নতি । এটা দিয়ে কাজ করে virtualenv পাইথন 3 এবং 2 জন্য এবং জন্য venv পাইথন 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শুধু Sayin'.
সিসিল কারি

দুঃখের বিষয় এটি 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
এটি একটি virtualenvভার্চুয়ালেনভ এবং একটি venvভার্চুয়ালেনভ উভয়ের পক্ষে কাজ করে ।
ফ্লোরিসাল

@ভারবোজ: ঠিক যেমনটি করার কথা, তাই না? একটি নিষ্ক্রিয় ভার্চুয়ালেনভ মানে ব্যবহারকারী স্ক্রিপ্ট কোনওটিতে চলছে না
MestreLion

কোনও ভার্চুয়ালেনভ সক্রিয় হয়েছে কিনা তা এটি পরীক্ষা করে, তবে এর অর্থ এই নয় যে পাইথন প্রক্রিয়াটি সেই ভ্যুচুয়ালেনভ থেকেই চলে।
এরব

20

Http://www.python.org/dev/peps/pep-0405/#specifications- এ ভ্যাচুয়ালেনভ পিপ অনুসারে আপনি কেবল os.en वातावरण [s 'VIRTUAL_ENV'] এর পরিবর্তে sys.prefix ব্যবহার করতে পারেন।

sys.real_prefix আমার ভার্চুয়ালেনভেতে নেই এবং sys.base_prefix এর সাথে একই।


8
ভ্যুচুয়ালেনভ হ'ল একক প্রকল্প যা কোনও পাইথন সংস্করণে ( github.com/pypa/virtualenv ) কাজ করে। আপনি যে পিইপিটির সাথে লিঙ্ক করেছেন তা পাইভেনভের জন্য, যা ভার্চুয়ালেনভের উপর ভিত্তি করে তবে আলাদাভাবে প্রয়োগ করা হয় (আরও ভাল) এবং পাইথন ৩.৩++ এ অন্তর্নির্মিত। এই প্রশ্নটি পাইচেনভ নয়, ভার্চুয়ালেনভ সম্পর্কে। আপনি সঠিক যে একটি পাইভেনভ মধ্যে নেই sys.real_prefix
কার্ল মেয়ার

5
এই উত্তরটি ব্যবহার করে ব্যাশ থেকে সনাক্ত করার একটি দুর্দান্ত উপায় হ'ল চালানো: env |grep VIRTUAL_ENV |wc -l যা ভেনভে থাকলে একটি 1 বা যদি না হয় তবে 0 প্রদান করবে।
তালিকা

3
আপনি যদি একটি শেল থাকেন আপনি কেবল ব্যবহার করতে পারেন [[ -n $VIRTUAL_ENV ]] && echo virtualenvবা [[ -z $VIRTUAL_ENV ]] && echo not virtualenvআপনার চাহিদা উপর নির্ভর করে।
ছয়

9

আপনার ভিতরে ভার্চুয়ালেনভ কিনা তা পরীক্ষা করতে:

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 উপযোগী উপায়। ধন্যবাদ।
আরজে

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এবং pyvenvবিন্দু sys.prefixপাইথন করার virtualenv ভেতরে ইনস্টল হিসাবে আপনি আশা করবে।

একই সময়ে, এর মূল মানটি sys.prefixহিসাবে উপলব্ধ করা হয় sys.base_prefix

আমরা এটি কোনও ভার্চুয়ালেনভের মধ্যে আছি কিনা তা সনাক্ত করতে আমরা এটি ব্যবহার করতে পারি।

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করা হয়নি set

সুতরাং নিরাপদে থাকতে হ্রোনককের জবাবের পরামর্শ অনুযায়ী উভয়ই পরীক্ষা করে দেখুন :

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
usonihorizon

@ ইউসোনিহরিজন সত্য, ধন্যবাদ!
ফ্লোরিসলা

ধন্যবাদ, ফ্লোরিসিয়া! আমি অ্যাপ্লিকেশন মোতায়েনের জন্য ভার্চুয়ালেনভ্রাপার থেকে বিল্ট-ইন ভেনভে রূপান্তর করার প্রক্রিয়াধীন এবং আপনার ব্যাখ্যা আমাকে কীভাবে এটি করতে হবে সে সম্পর্কে টেমপ্লেট দিয়েছে। আমি কেবল if hasattr(sys, 'real_prefix'):পরীক্ষার উপর নির্ভর করেছিলাম , যা আর কাজ করে না।
usonianhorizon

8

আপনি এটি করতে পারেন which pythonএবং এটি ভার্চুয়াল এনভির মধ্যে একটিতে নির্দেশ করছে কিনা।


1
whichউইন্ডোজ ডিফল্টভাবে উপলব্ধ হয় না। আপনি উইন্ডোটিতেwhere পরিবর্তে ব্যবহার করতে পারেন , বা কোন ক্রোপকে নিয়োগ করতে পারেন । বা তাকান sys.executable। কিন্তু এখনও, আরও ভাল পদ্ধতি আছে।
ফ্লোরিসা or

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]

আমার আসল পোস্ট থেকেই আমি Anaconda দ্বারা venv থেকে সরেছেন (এবং পাইথন নিজেই বিকশিত করেনি যেমন-এ-যেমন ভার্চুয়াল পরিবেশের)।

এই ইস্যুটির পুনর্বিবেচনা করা হচ্ছে, এখানে কিছু আপডেট হওয়া পাইথন কোড রয়েছে যা আপনি নির্দিষ্ট পাইথন ভার্চুয়াল পরিবেশে (ভেনভ) কাজ করছেন তা পরীক্ষা করতে আপনি sertোকাতে পারেন।

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আপনি যদি কোনও ভার্চুয়ালেনভে থাকেন তবে এটি বিশ্বব্যাপী পরিবর্তে অজগরটির দিকে ইঙ্গিত করবে


1
আমি মনে করি না এটি আসলে প্রশ্নের উত্তর দেয় (যা "বর্তমান স্ক্রিপ্ট" সম্পর্কে উদ্বিগ্ন)। তবে এটি আমার বিশেষ প্রশ্নের উত্তর দেয়, "আমি কমান্ড লাইন থেকে ভার্চুয়াল পরিবেশে আছি কিনা তা আমি কীভাবে জানতে পারি" "
ukrutt

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প্যাকেজগুলি কোথায় ইনস্টল করা হয়েছে তা আপনাকে বলে ।


পাইথন ভার্চুয়াল পরিবেশের মধ্যে চলছে কিনা তা এটি জানায় না not
ফ্লোরিসালা

@ ফ্লোরিসালা আপনি কি বিস্তারিত বলতে পারবেন? যদি site.getsitepackages()সিস্টেমটি নয় এমন একটি ডিরেক্টরি যদি আউটপুট করে তবে আপনি ভার্চুয়াল পরিবেশে অনুমান করতে পারেন।
ফ্লো 2 কে

আপনি একাধিক স্থানে পাইথন ইনস্টল করতে পারেন। উদাহরণস্বরূপ, উইন্ডোজ আপনি একটি 'সিস্টেম' পাইথন এবং একটি উইন পাইথন বিতরণ এবং একটি কন্ডা ভিত্তিক পাইথন ইনস্টল করতে পারেন। এই সমস্তগুলির বিভিন্ন সাইট-প্যাকেজ ফোল্ডার রয়েছে তবে অগত্যা এ দ্বারা তৈরি হয় না (বা ব্যবহৃত হয়) virtualenv
ফ্লোরিসা

@ ফ্লোরিসা ভাল পয়েন্ট - আমি এইটি দেখেছি (ভেন্ট বা না) প্রশ্নটি যা জিজ্ঞাসা করছে (আমি অন্য প্রশ্নের জন্য একই রকম উত্তর লিখেছি)। আমি একমত যে আপনি কোনও ভিনভে আছেন কি না সে সম্পর্কে নিশ্চিত উত্তর দিতে পারে না তবে আপনি কোন পাইথন বা venvআপনি কী ব্যবহার করছেন তা আপনাকে বলতে সহায়তা করতে পারে ।
ফ্লো 2 কে

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

প্যারেন্টিহিসের অর্থ হ'ল আপনি প্রকৃতপক্ষে "ভার্চুয়ালএনভনাম" নামক ভার্চুয়াল পরিবেশে।


আপনি এবং আমি 'ভার্চুয়ালEnvName' ঠিকঠাক পড়তে পারি। তবে প্রশ্নটি হল, পাইথন মডিউলটি এটি কীভাবে পড়তে পারে।
ফ্লোরিসাল

-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 মাস পরে আমি একটি উত্তর সরবরাহ করেছি যা আমার পক্ষে সীমাবদ্ধতার মধ্যে কাজ করে (আমি ভার্চুয়ালেনভ এবং পিপেনভের মধ্যে নড়াচড়া করি না)। আপনার নিজের চেহারা আরও ভাল করার জন্য অন্যের জবাবগুলিকে কমিয়ে দেওয়া খারাপ খেলা।
রিচ লাইসাকোভস্কি পিএইচডি

ধনী, আপনার পক্ষে যা কাজ করে তা অন্য ব্যক্তির পক্ষে কাজ নাও করতে পারে। এটি এমনকি মূল পোস্টারের জন্যও কাজ না করে।
ফ্লোরিসা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.