বর্তমান স্ক্রিপ্টটি কোনও ভার্চুয়ালেনভ পরিবেশের মধ্যে চলছে কিনা তা নির্ধারণ করা সম্ভব?
বর্তমান স্ক্রিপ্টটি কোনও ভার্চুয়ালেনভ পরিবেশের মধ্যে চলছে কিনা তা নির্ধারণ করা সম্ভব?
উত্তর:
এএফআইএকে এটি পরীক্ষা করার সবচেয়ে নির্ভরযোগ্য উপায় (এবং যে উপায়ে অভ্যন্তরীণভাবে ভার্চুয়ালেনভ এবং পাইপে ব্যবহৃত হয়) তা হল অস্তিত্বের জন্য যাচাই করা sys.real_prefix
:
import sys
if hasattr(sys, 'real_prefix'):
#...
একটি virtualenv ভিতরে, sys.prefix
virtualenv নির্দেশিকাতে পয়েন্ট, এবং sys.real_prefix
সিস্টেম পাইথন (প্রায়ই এর "বাস্তব" উপসর্গ পয়েন্ট /usr
বা /usr/local
বা কিছু যেমন)।
একটি ভার্চুয়ালেনভের বাইরে sys.real_prefix
থাকা উচিত নয়।
VIRTUAL_ENV
পরিবেশের পরিবর্তনশীল ব্যবহার নির্ভরযোগ্য নয়। এটি ভার্চুয়ালেনভ activate
শেল স্ক্রিপ্ট দ্বারা সেট করা হয়েছে , তবে ভার্চুয়ালেনভ 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
(নোটিশ মূলধন ভি)
আপনি যদি ভার্চুয়াল 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 {} \+
হবে (চিন্তা করবেন না, তারা স্বয়ংক্রিয়ভাবে পুনর্নির্মাণ করবে)।
...\lib\site-packages
করে %PATH%
। সুতরাং এটি সেই ক্ষেত্রে একটি মিথ্যা ইতিবাচক প্রত্যাবর্তন করবে।
এটি কার্ল মেয়ারের গৃহীত উত্তরের একটি উন্নতি । এটা দিয়ে কাজ করে 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
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
। শুধু Sayin'.
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
ভার্চুয়ালেনভ এবং একটি venv
ভার্চুয়ালেনভ উভয়ের পক্ষে কাজ করে ।
Http://www.python.org/dev/peps/pep-0405/#specifications- এ ভ্যাচুয়ালেনভ পিপ অনুসারে আপনি কেবল os.en वातावरण [s 'VIRTUAL_ENV'] এর পরিবর্তে sys.prefix ব্যবহার করতে পারেন।
sys.real_prefix আমার ভার্চুয়ালেনভেতে নেই এবং 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
আপনার চাহিদা উপর নির্ভর করে।
আপনার ভিতরে ভার্চুয়ালেনভ কিনা তা পরীক্ষা করতে:
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
এবং 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
আপনি যদি অ্যানাকোন্ডা ভার্চুয়াল পরিবেশ ব্যবহার করছেন তবে ভিক্টোরিয়া স্টুয়ার্টের উত্তরটি দেখুন ।
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]
আমার আসল পোস্ট থেকেই আমি 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! :-)
>>>
সহজতম উপায়টি কেবল চালানো: which python
আপনি যদি কোনও ভার্চুয়ালেনভে থাকেন তবে এটি বিশ্বব্যাপী পরিবর্তে অজগরটির দিকে ইঙ্গিত করবে
(সম্পাদিত) আমি সেভাবে খুঁজে পেয়েছি, আপনি এটি সম্পর্কে কী ভাবেন? (এটা এছাড়াও 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>
প্যারেন্টিহিসের অর্থ হ'ল আপনি প্রকৃতপক্ষে "ভার্চুয়ালএনভনাম" নামক ভার্চুয়াল পরিবেশে।
একটি সম্ভাব্য সমাধান হ'ল:
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
।