是否有可能确定当前脚本是否在virtualenv环境中运行?
当前回答
试着使用pip -V(注意大写V)
如果您正在运行虚拟环境。它会显示通往环境的路径。的位置。
其他回答
它不是万无一失的,但是对于UNIX环境的简单测试,比如
if run("which python3").find("venv") == -1:
# something when not executed from venv
对我来说很好。这比测试现有的某些属性要简单得多,无论如何,您应该将venv目录命名为venv。
根据http://www.python.org/dev/peps/pep-0405/#specification上的virtualenv pep,你可以使用sys。前缀代替os.environ['VIRTUAL_ENV']。
sys。Real_prefix在我的virtualenv中不存在,sys.base_prefix也是如此。
最可靠的检查方法是检查sys。Prefix == sys.base_prefix。如果它们相等,则不是在虚拟环境中;如果它们不相等,你就是。在虚拟环境中,sys。Prefix指向虚拟环境,sys. Prefix指向虚拟环境。base_prefix是创建virtualenv的系统Python的前缀。
上面的代码总是适用于python3 stdlib venv和最近的virtualenv(自版本20起)。旧版本的virtualenv使用sys. exe。而不是sys. Real_prefix。Base_prefix(和sys。real_prefix在虚拟环境之外不存在),在Python 3.3和更早的sys. real_prefix中。Base_prefix从未存在过。所以一个完全健壮的检查可以处理所有这些情况,看起来像这样:
import sys
def get_base_prefix_compat():
"""Get base/real prefix, or sys.prefix if there is none."""
return getattr(sys, "base_prefix", None) or getattr(sys, "real_prefix", None) or sys.prefix
def in_virtualenv():
return get_base_prefix_compat() != sys.prefix
如果你只关心支持的Python版本和最新的virtualenv,你可以用sys.base_prefix替换get_base_prefix_compat()。
使用VIRTUAL_ENV环境变量不可靠。它是由virtualenv激活shell脚本设置的,但是virtualenv可以在不激活的情况下使用,直接从virtualenv的bin/(或Scripts)目录运行可执行文件,在这种情况下,$VIRTUAL_ENV将不会被设置。或者一个非virtualenv的Python二进制文件可以在shell中激活virtualenv时直接执行,在这种情况下,$VIRTUAL_ENV可以在一个Python进程中设置,而该进程实际上并没有在该virtualenv中运行。
2019年11月更新(附后)。
我经常使用几个安装了anaconda的虚拟环境(venv)。这个代码片段/示例使您能够确定是否处于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——在bash脚本中使用:
您还可以在bash脚本中使用这种方法(例如,必须在特定的虚拟环境中运行的脚本)。示例(添加到bash脚本):
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年11月]
为了简单起见,我喜欢Matt的答案(https://stackoverflow.com/a/51245168/1904943)。
从我最初的帖子开始,我已经从Anaconda venv (Python本身已经进化为虚拟环境)转移到其他地方。
重新检查这个问题,这里有一些更新的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! :-)
>>>
检查你的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")}')
推荐文章
- 数据类vs类型。NamedTuple主要用例
- 如何从macOS完全卸载蟒蛇
- 是否有可能键入提示一个lambda函数?
- 'dict'对象没有has_key属性
- 使用Pandas groupby连接来自几行的字符串
- Pandas:给定列的数据帧行之和
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 如何激活蟒蛇环境
- 省略[…]意思是在一个列表里?
- 为什么我得到“'str'对象没有属性'读取'”当尝试使用' json。载入字符串?
- 不区分大小写的列表排序,没有降低结果?
- 排序后的语法(key=lambda:…)
- 在烧瓶中返回HTTP状态代码201
- 使用python创建一个简单的XML文件
- APT命令行界面式的yes/no输入?