เป็นไปได้หรือไม่ที่จะตัดสินว่าสคริปต์ปัจจุบันกำลังทำงานอยู่ในสภาพแวดล้อม virtualenv หรือไม่?
เป็นไปได้หรือไม่ที่จะตัดสินว่าสคริปต์ปัจจุบันกำลังทำงานอยู่ในสภาพแวดล้อม virtualenv หรือไม่?
คำตอบ:
AFAIK วิธีที่น่าเชื่อถือที่สุดในการตรวจสอบสิ่งนี้ (และวิธีที่ใช้ภายใน virtualenv และ pip) คือการตรวจสอบการมีอยู่ของ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
ตัวแปรสภาพแวดล้อมไม่น่าเชื่อถือ มันถูกตั้งค่าโดยactivate
เชลล์สคริปต์virtualenv แต่ virtualenv สามารถใช้ได้โดยไม่ต้องเปิดใช้งานโดยเรียกใช้โดยตรงจากแฟ้มปฏิบัติการbin/
(หรือScripts
) ของ virtualenv ซึ่ง$VIRTUAL_ENV
จะไม่สามารถตั้งค่าได้
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
ลองใช้pip -V
(สังเกตเมืองหลวง V)
หากคุณกำลังใช้งาน env เสมือน มันจะแสดงเส้นทางไปยังตำแหน่งของ env
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สำหรับ Python 3 และ 2 และสำหรับโมดูลvenvใน Python 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
ครอบคลุม virtualenv ความเท่าเทียมกันของ non-empty sys.base_prefix
กับsys.prefix
cover venv
พิจารณาสคริปต์ที่ใช้ฟังก์ชันดังนี้:
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
ตัวแปรจะถูกล้าง / ว่าง Python จะยกระดับ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'
แน่นอนว่าการตรวจสอบตัวแปรสภาพแวดล้อมเดียวกันนี้สามารถทำได้นอกสคริปต์ Python ในเชลล์
virtualenv
virtualenv และvenv
virtualenv
จาก virtualenv pep ที่http://www.python.org/dev/peps/pep-0405/#specificationคุณสามารถใช้ sys.prefix แทน os.environ ['VIRTUAL_ENV']
sys.real_prefix ไม่มีอยู่ใน virtualenv ของฉันและเหมือนกันกับ sys.base_prefix
sys.real_prefix
มีไม่มี
env |grep VIRTUAL_ENV |wc -l
ซึ่งจะคืนค่า 1 หากอยู่ใน venv หรือ 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")}')
มีคำตอบที่ดีหลายคำที่นี่และคำตอบที่ดีกว่าบางข้อ นี่คือภาพรวม
อย่าพึ่งพาที่ตั้งของ Python หรือ site-packages
โฟลเดอร์
หากตั้งค่าเหล่านี้เป็นสถานที่ที่ไม่ได้มาตรฐานนั่นไม่ได้หมายความว่าคุณจะอยู่ในสภาพแวดล้อมเสมือนจริง ผู้ใช้สามารถติดตั้งเวอร์ชัน Python ได้มากกว่าหนึ่งเวอร์ชันและไม่ได้อยู่ในตำแหน่งที่คุณต้องการ
หลีกเลี่ยงการดูที่:
sys.executable
sys.prefix
pip -V
which python
ยังไม่ได้ตรวจสอบสถานะของvenv
, .venv
หรือenvs
ในใด ๆ ของเส้นทางเหล่านี้ สิ่งนี้จะทำลายสภาพแวดล้อมที่มีสถานที่ตั้งที่ไม่เหมือนใคร ตัวอย่างเช่น
Pipenvใช้ค่าแฮชเป็นชื่อสำหรับสภาพแวดล้อม
VIRTUAL_ENV
ตัวแปรสภาพแวดล้อมทั้งvirtualenv
และvenv
ตั้งค่าตัวแปรสภาพแวดล้อม$VIRTUAL_ENV
เมื่อเปิดใช้งานสภาพแวดล้อม ดูPEP 405
คุณสามารถอ่านตัวแปรนี้ในเชลล์สคริปต์หรือใช้รหัส Python นี้เพื่อตรวจสอบว่ามีการตั้งค่าไว้หรือไม่
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
ที่จะติดตั้ง Python ภายในของ virtualenv ในขณะที่คุณจะคาดหวัง
ในเวลาเดียวกันที่เดิมค่าของทำยังใช้ได้ในฐานะที่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
แทน
เพื่อความปลอดภัยตรวจสอบทั้งสองอย่างตามคำแนะนำในคำตอบของ hroncok :
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
และดูว่ามันชี้ไปที่หนึ่งในเสมือน env
ฉันใช้สภาพแวดล้อมเสมือนจริง (venv) ที่ติดตั้ง Anaconda หลายแห่งเป็นประจำ ข้อมูลโค้ด / ตัวอย่างนี้ช่วยให้คุณสามารถตรวจสอบว่าคุณอยู่ใน venv (หรือสภาพแวดล้อมระบบของคุณ) หรือไม่และต้องใช้ venv เฉพาะสำหรับสคริปต์ของคุณด้วย
เพิ่มไปยังสคริปต์ Python (ข้อมูลโค้ด):
# ----------------------------------------------------------------------------
# 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 [พ.ย. 2562]
ตั้งแต่โพสต์ต้นฉบับของฉันฉันย้ายจาก Anaconda venv (และ Python เองได้พัฒนาviz-a-vizสภาพแวดล้อมเสมือน )
ทบทวนปัญหานี้นี่คือรหัส Python ที่ได้รับการปรับปรุงซึ่งคุณสามารถแทรกเพื่อทดสอบว่าคุณกำลังทำงานในสภาพแวดล้อมเสมือน Python (venv) ที่เฉพาะเจาะจง
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
คุณใช้
มันไม่ได้เป็นกระสุน แต่สำหรับการทดสอบอย่างง่ายของสภาพแวดล้อม UNIX
if run("which python3").find("venv") == -1:
# something when not executed from venv
ใช้งานได้ดีสำหรับฉัน venv
มันเป็นเรื่องง่ายแล้วการทดสอบที่มีอยู่ของแอตทริบิวต์บางอย่างและอย่างไรก็ตามคุณควรตั้งชื่อไดเรกทอรี venv ของคุณ
ใน windows OS คุณจะเห็นสิ่งนี้:
C:\Users\yourusername\virtualEnvName\Scripts>activate
(virtualEnvName) C:\Users\yourusername\virtualEnvName\Scripts>
วงเล็บหมายความว่าคุณอยู่ในสภาพแวดล้อมเสมือนจริงที่เรียกว่า "virtualEnvName"
ศักยภาพการแก้ปัญหาคือ:
os.access(sys.executable, os.W_OK)
ในกรณีของฉันฉันแค่อยากจะตรวจสอบว่าฉันสามารถติดตั้งรายการที่มี pip ตามที่เป็นอยู่ แม้ว่ามันอาจจะไม่ใช่โซลูชันที่เหมาะสมสำหรับทุกกรณี แต่เพียงตรวจสอบว่าคุณมีสิทธิ์ในการเขียนสำหรับตำแหน่งของ Python ที่สามารถใช้งานได้
หมายเหตุ:งานนี้ในทุกรุ่นของงูใหญ่ แต่ยังผลตอบแทนถ้าคุณใช้ระบบหลามกับ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'])
นี่เป็นคำถามเก่า แต่มีตัวอย่างจำนวนมากเกินไปที่ซับซ้อนเกินไป
Keep It Simple: (ใน Jupyter Notebook หรือ Python 3.7.1 terminal บน Windows 10)
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