是否有可能确定当前脚本是否在virtualenv环境中运行?


当前回答

一个潜在的解决方案是:

os.access(sys.executable, os.W_OK)

在我的例子中,我真的只是想检测我是否可以用pip原样安装项目。虽然这可能不是所有情况下的正确解决方案,但请考虑简单地检查您是否具有Python可执行文件位置的写权限。

注意:这适用于所有版本的Python,但如果你使用sudo运行系统Python,也会返回True。下面是一个潜在的用例:

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

其他回答

如果你正在使用水蟒,这里是解决方案。该命令列出所有可发现的环境

conda info --envs

(编辑)我是这样发现的,你怎么看?(它还返回venv的基本路径,甚至适用于不检查env变量的readthedocs):

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安装包的位置。

一个潜在的解决方案是:

os.access(sys.executable, os.W_OK)

在我的例子中,我真的只是想检测我是否可以用pip原样安装项目。虽然这可能不是所有情况下的正确解决方案,但请考虑简单地检查您是否具有Python可执行文件位置的写权限。

注意:这适用于所有版本的Python,但如果你使用sudo运行系统Python,也会返回True。下面是一个潜在的用例:

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

最简单的方法是运行:哪个python,如果你在virtualenv中,它会指向它的python,而不是全局的