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


当前回答

这是对卡尔·迈耶的公认答案的改进。它可以与Python 3和2中的virtualenv一起工作,也可以与Python 3中的venv模块一起工作:

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,非空的sys。带sys的Base_prefix。前缀覆盖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 

其他回答

这是对卡尔·迈耶的公认答案的改进。它可以与Python 3和2中的virtualenv一起工作,也可以与Python 3中的venv模块一起工作:

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,非空的sys。带sys的Base_prefix。前缀覆盖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 

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

一个潜在的解决方案是:

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

根据http://www.python.org/dev/peps/pep-0405/#specification上的virtualenv pep,你可以使用sys。前缀代替os.environ['VIRTUAL_ENV']。

sys。Real_prefix在我的virtualenv中不存在,sys.base_prefix也是如此。

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

conda info --envs