ตรวจสอบว่า Python ทำงานภายใน virtualenv


272

เป็นไปได้หรือไม่ที่จะตัดสินว่าสคริปต์ปัจจุบันกำลังทำงานอยู่ในสภาพแวดล้อม virtualenv หรือไม่?


2
อยากรู้อยากเห็นทำไมคุณต้องการที่จะรู้ว่า?
Jorge Leitao

1
เช่นเพื่อให้สามารถเขียนสคริปต์ที่กำหนดเองที่สร้างพรอมต์สำหรับเชลล์ของคุณและคุณต้องการให้พรอมต์นั้นระบุว่าคุณอยู่ใน venv หรือไม่ดังนั้นคุณต้องการที่จะสามารถตรวจจับได้ว่าจากภายในรหัสนั้นโดยไม่ต้องเรียกเครื่องมือภายนอก .
Marcin Orlowski

คำตอบ:


227

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จะไม่สามารถตั้งค่าได้


11
ดูเหมือนจะไม่สามารถใช้งานได้ใน Python 3 อีกต่อไป
Dan P.

49
หากคุณใช้ virtualenv (github.com/pypa/virtualenv) คำตอบนี้ถูกต้องเท่ากันสำหรับ Python 2 หรือ Python 3 หากคุณใช้ pyvenv ( legacy.python.org/dev/peps/pep-0405 ) virtualenv - เทียบเท่ากับ Python 3.3+ (แต่ไม่ใช่สิ่งเดียวกันกับ virtualenv) จากนั้นจะใช้ sys.base_prefix แทน sys.real_prefix และ sys.base_prefix จะมีอยู่เสมอ นอก pyvenv มันเท่ากับ sys.prefix
Carl Meyer

2
@ Kounavi ฉันไม่คิดว่าเป็นไปได้ว่าเวอร์ชั่น Windows จะมีผลกระทบใด ๆ คำตอบนี้เป็นส่วนสำคัญของการทำงานของ virtualenv บนแพลตฟอร์มใด ๆ เป็นไปได้หรือไม่ที่คุณใช้ Python 3 pyvenv ไม่ใช่ virtualenv บนเครื่อง Windows 2012 หรือว่ามีบางอย่างเกิดขึ้นกับ PATH และคุณไม่ได้ทำงานใน virtualenv เมื่อคุณคิดว่าคุณเป็น
Carl Meyer

3
One-liner สำหรับสคริปต์ทุบตีPYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Sam Myers

2
คำตอบนี้ล้าสมัยไม่น่าแปลกใจ โดยเฉพาะคำตอบนี้จะส่งกลับเชิงลบเท็จสำหรับกรณีการใช้งานทั่วไป เลวร้าย. แต่เห็น: hroncok 's ปรับปรุงอำนาจอย่างถูกต้องตรวจสอบทั้งหมดไม่ใช่งู venvsหรือวิกตอเรียจวร์ต ' s คำตอบเผด็จการอย่างถูกต้องตรวจสอบทุก venvs ( upvotes ของฉันทั้งหมดสำหรับใครก็ตามที่รวมสองคำตอบ. )
Cecil Curry

97

ลองใช้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 {} \+(ไม่ต้องกังวลพวกเขาจะสร้างใหม่โดยอัตโนมัติ)
jeremysprofile

ฉันเพิ่งทดสอบสิ่งนี้บน Windows 10 ด้วย Python 3.7 มันพิมพ์สถานที่ตั้งของ pip จากค่าเริ่มต้นติดตั้งใน...\lib\site-packages %PATH%ดังนั้นมันจะคืนค่าบวกเท็จในกรณีนั้น
JamesThomasMoon1979

71

นี้คือการปรับปรุงของคำตอบที่ได้รับการยอมรับโดยคาร์ลเมเยอร์ มันทำงานร่วมกับ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.prefixcover 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 

4
ตั้งแต่ Python 3.3 ไม่ได้รับการบำรุงรักษาหรือได้รับการสนับสนุนโดยส่วนใหญ่งูหลาม 3 def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefixกรอบและการใช้งานฟังก์ชั่นนี้ในขณะนี้ลดไปเล็กน้อยหนึ่งซับ: เพียงแค่พูดว่า
เซซิลแกงกะหรี่

น่าเสียดายที่นี่ไม่ได้ทำงานกับpipenvสภาพแวดล้อมเสมือนที่สร้างขึ้น
dragon788

46

ตรวจสอบ$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 ในเชลล์


1
สิ่งนี้ใช้ได้ทั้งกับvirtualenvvirtualenv และvenvvirtualenv
florisla

@ verboze: มันควรจะทำใช่มั้ย virtualenv ที่ปิดใช้งานหมายความว่าสคริปต์ผู้ใช้ไม่ได้ทำงานอยู่
MestreLion

วิธีนี้จะตรวจสอบว่ามีการเปิดใช้งาน virtualenv หรือไม่ แต่นั่นไม่ได้หมายความว่ากระบวนการ Python ที่ทำงานนั้นมาจาก virtualenv นั้น
Erb

20

จาก virtualenv pep ที่http://www.python.org/dev/peps/pep-0405/#specificationคุณสามารถใช้ sys.prefix แทน os.environ ['VIRTUAL_ENV']

sys.real_prefix ไม่มีอยู่ใน virtualenv ของฉันและเหมือนกันกับ sys.base_prefix


8
virtualenv เป็นโปรเจ็กต์แบบสแตนด์อโลนที่ทำงานกับ Python ทุกรุ่น ( github.com/pypa/virtualenv ) PEP ที่คุณเชื่อมโยงนั้นใช้สำหรับ pyvenv ซึ่งใช้ virtualenv แต่มีการใช้งานแตกต่างกัน (ดีกว่า) และติดตั้งใน Python 3.3+ คำถามนี้เกี่ยวกับ virtualenv ไม่ใช่ pyvenv คุณถูกต้องว่าใน pyvenv sys.real_prefixมีไม่มี
คาร์ลเมเยอร์

5
วิธีที่ดีในการตรวจจับจาก bash โดยใช้คำตอบนี้คือการเรียกใช้: env |grep VIRTUAL_ENV |wc -l ซึ่งจะคืนค่า 1 หากอยู่ใน venv หรือ 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
นี่เป็นวิธีการข้ามแพลตฟอร์มที่ดีที่สุด (Windows / Unix)
Adi Unnithan

จนถึงตอนนี้เป็นเพียงแพลตฟอร์มข้าม, python 2 และ python 3 วิธีที่เข้ากันได้ ขอบคุณ
RJ

9

มีคำตอบที่ดีหลายคำที่นี่และคำตอบที่ดีกว่าบางข้อ นี่คือภาพรวม

วิธีที่จะไม่ทำ

อย่าพึ่งพาที่ตั้งของ 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.prefixsys.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

งูใหญ่

หากคุณกำลังใช้งูสภาพแวดล้อมเสมือนตรวจสอบ คำตอบวิกตอเรียจวร์ต


OP ถามว่า "ฉันจะทำอย่างไร" ไม่ใช่ "ไม่ต้องทำอย่างไร" คำตอบนี้มากไป มันเกินกว่าจิตวิญญาณของคำถามและทำให้คำตอบสับสนด้วยการเปลี่ยนแปลงที่มากเกินไป โปรดรักษาคำตอบของคุณให้ง่ายที่สุดและตอบคำถามโดยตรง
Rich Lysakowski ระดับปริญญาเอก

ฉันกำลังสรุปคำตอบหลายคำตอบที่นี่และให้คำแนะนำว่าข้อใดเหมาะกับสถานการณ์เฉพาะ คำถามเดิมไม่ได้ให้บริบทเพียงพอที่จะเลือกหนึ่งในเทคนิคเหล่านี้ว่าเป็น 'ที่ดีที่สุด' - มันไม่ง่ายอย่างนั้น
florisla

1
ในส่วนของ sys.base_prefix ไม่ควรทำการทดสอบ:running_in_virtualenv = sys.*base_*prefix != sys.prefix
usonianhorizon

@usonianhorizon จริงขอบคุณ!
florisla

ขอบคุณ @florisia! ฉันอยู่ระหว่างการเปลี่ยนจาก virtualenvwrapper เป็น venv ในตัวสำหรับการปรับใช้แอปพลิเคชันและคำอธิบายของคุณให้แม่แบบแก่ฉันเกี่ยวกับวิธีการทำ ฉันพึ่งการif hasattr(sys, 'real_prefix'):ทดสอบเท่านั้นซึ่งไม่ได้ผลอีกต่อไป
usonianhorizon

8

คุณสามารถทำwhich pythonและดูว่ามันชี้ไปที่หนึ่งในเสมือน env


1
whichไม่สามารถใช้งานได้ตามค่าเริ่มต้นใน Windows คุณสามารถใช้whereแทนบน Windows หรือใช้คราฟต์ sys.executableหรือดูที่ แต่ยังมีวิธีการที่ดีกว่า
florisla

5
  • อัปเดตเมื่อ พ.ย. 2019 (ต่อท้าย)

ฉันใช้สภาพแวดล้อมเสมือนจริง (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!  :-)
>>> 

3

วิธีที่ง่ายที่สุดในการรันคือ: which pythonถ้าคุณอยู่ใน virtualenv มันจะชี้ไปยังไพ ธ อนแทนที่จะเป็นโกลบอล


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ติดตั้งแพคเกจ


สิ่งนี้ไม่ได้บอกว่า Python ทำงานอยู่ในสภาพแวดล้อมเสมือนจริงหรือไม่
florisla

@florisla คุณช่วยอธิบายได้ไหม? หากsite.getsitepackages()เอาท์พุทไดเรกทอรีที่ไม่ใช่ระบบคุณสามารถสรุปได้ว่าคุณอยู่ในสภาพแวดล้อมเสมือนจริง
flow2k

คุณสามารถติดตั้ง Python ได้ในหลาย ๆ ที่ ตัวอย่างเช่นบน Windows คุณสามารถติดตั้ง Python 'ระบบ' และการกระจาย WinPython บวกกับ Python ตาม Conda เหล่านี้ทั้งหมดมีโฟลเดอร์เว็บไซต์แพคเกจที่แตกต่างกัน แต่ไม่ได้สร้างโดยจำเป็นต้อง virtualenv(หรือใช้ในการบริการ)
florisla

@florisla จุดดี - ฉันเพิ่งเห็นสิ่งนี้ (venv หรือไม่) เป็นสิ่งที่คำถามถาม (ฉันได้เขียนคำตอบที่คล้ายกันสำหรับคำถามอื่น) ฉันเห็นด้วยกับสิ่งนี้อาจไม่ได้ให้คำตอบที่แน่ใจว่าคุณกำลังอยู่ใน venv หรือไม่ แต่สามารถช่วยในการบอกคุณว่า Python หรือที่venvคุณใช้
flow2k

-1

มันไม่ได้เป็นกระสุน แต่สำหรับการทดสอบอย่างง่ายของสภาพแวดล้อม UNIX

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

ใช้งานได้ดีสำหรับฉัน venvมันเป็นเรื่องง่ายแล้วการทดสอบที่มีอยู่ของแอตทริบิวต์บางอย่างและอย่างไรก็ตามคุณควรตั้งชื่อไดเรกทอรี venv ของคุณ


-1

ใน windows OS คุณจะเห็นสิ่งนี้:

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

วงเล็บหมายความว่าคุณอยู่ในสภาพแวดล้อมเสมือนจริงที่เรียกว่า "virtualEnvName"


คุณและฉันสามารถอ่าน 'virtualEnvName' ได้ดี แต่คำถามก็คือโมดูล Python สามารถอ่านสิ่งนี้ได้อย่างไร
florisla

-1

ศักยภาพการแก้ปัญหาคือ:

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

-1

นี่เป็นคำถามเก่า แต่มีตัวอย่างจำนวนมากเกินไปที่ซับซ้อนเกินไป

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
florisla

Florisla, คุณให้คำตอบของคุณ "วิธีที่จะไม่ทำ" เกือบ 3 เดือนหลังจากที่ฉันให้คำตอบที่เหมาะกับฉันภายในขีด จำกัด (ฉันไม่ได้ย้ายระหว่าง virtualenv และ pipenv) เป็นกีฬาที่ไม่ดีที่จะลดคำตอบของคนอื่นเพื่อทำให้คุณดูดีขึ้น
Lysakowski ระดับปริญญาเอกรวย

รวยอะไรที่ใช้ได้ผลกับคุณอาจไม่ได้ผลกับคนอื่น มันอาจไม่ได้ผลกับโปสเตอร์ต้นฉบับ
florisla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.