pip 判断当前是否运行在虚拟环境中

1. python进程如何知道自己是不是在虚拟环境中

python的进程如何知道自身是不是运行在虚拟环境中呢?这是一个非常有趣的问题,平常我们从未关心过,但在pip的原码里,却对这个疑问进行了解答,running_under_virtualenv函数 位于pip/_internal/locations.py脚本中,它专门用来检测当前环境是否是虚拟环境。

2. python3 自带的venv模块所创建的虚拟环境

函数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

采用这种方式所创建的虚拟环境可以使用上面的函数准确检测

3. virtualenv 所创建的虚拟环境

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

4. conda创建的虚拟环境

对于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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案