是否有可能确定当前脚本是否在virtualenv环境中运行?
当前回答
最简单的方法是运行:哪个python,如果你在virtualenv中,它会指向它的python,而不是全局的
其他回答
检查$VIRTUAL_ENV环境变量。
在活动的虚拟环境中,$VIRTUAL_ENV环境变量包含虚拟环境的目录。
>>> import os
>>> os.environ['VIRTUAL_ENV']
'/some/path/project/venv'
一旦执行deactivate / leave虚拟环境,$VIRTUAL_ENV变量将被清除/空。Python将引发一个KeyError,因为环境变量未设置。
>>> import os
>>> os.environ['VIRTUAL_ENV']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'
当然,这些相同的环境变量检查也可以在Python脚本之外的shell中完成。
一个潜在的解决方案是:
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 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,而不是全局的
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! :-)
>>>
推荐文章
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?