python的进程如何知道自身是不是运行在虚拟环境中呢?这是一个非常有趣的问题,平常我们从未关心过,但在pip的原码里,却对这个疑问进行了解答,running_under_virtualenv函数 位于pip/_internal/locations.py脚本中,它专门用来检测当前环境是否是虚拟环境。
函数running_under_virtualenv 内部分别调用了_running_under_venv 和 _running_under_regular_virtualenv ,我们分别来看这两个函数
def _running_under_venv():
# type: () -> bool
"""Checks if sys.base_prefix and sys.prefix match.
This handles PEP 405 compliant virtual environments.
"""
return sys.prefix != getattr(sys, "base_prefix", sys.prefix)
根据PEP 405 的内容,如果sys.prefix 与 sys.base_prefix相同则表明进程处于虚拟环境,反之则不在虚拟环境中,这里必须重点提醒读者,这个函数主要是检测使用python3 版本venv模块所创建的虚拟环境
python3 -m venv myenv
采用这种方式所创建的虚拟环境可以使用上面的函数准确检测
在python3 提供venv模块前,python社区开发人员主要使用virtualenv 来创建虚拟环境,_running_under_regular_virtualenv 可以准确的检测使用该工具创建的虚拟环境
def _running_under_regular_virtualenv():
# type: () -> bool
"""Checks if sys.real_prefix is set.
This handles virtual environments created with pypa's virtualenv.
"""
# pypa/virtualenv case
return hasattr(sys, 'real_prefix')
对于conda所创建的虚拟环境,上述两个函数均不能准确检测,对于conda创建的虚拟环境,可以借助 CONDA_DEFAULT_ENV环境变量
import os
def is_conda_env():
return "CONDA_DEFAULT_ENV" in os.environ
进入conda的虚拟环境时,conda会设置这个环境变量
(py36) (base) root@192:/Users/kwsy/kwsy# python
Python 3.6.15 | packaged by conda-forge | (default, Dec 3 2021, 18:49:43)
[GCC Clang 11.1.0] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['CONDA_DEFAULT_ENV']
'py36'
只要存在这个环境变量就可以证明程序自身处于conda所创建的虚拟环境
QQ交流群: 211426309