¿Es posible determinar si el script actual se está ejecutando dentro de un entorno virtualenv?
                    
                        python
                                virtualenv
                                
                    
                    
                        miracle2k
fuente
                
                fuente

Respuestas:
AFAIK la forma más confiable de verificar esto (y la forma en que se usa internamente en virtualenv y en pip) es verificar la existencia de
sys.real_prefix:Dentro de un virtualenv,
sys.prefixapunta al directorio virtualenv, ysys.real_prefixapunta al prefijo "real" del sistema de Python (a menudo/usro/usr/localo algo así).Fuera de un virtualenv,
sys.real_prefixno debería existir.Usar la
VIRTUAL_ENVvariable de entorno no es confiable. Está configurado por elactivatescript de shell virtualenv , pero un virtualenv puede usarse sin activación ejecutando directamente un ejecutable desde el directorio virtualenvbin/(oScripts), en cuyo caso$VIRTUAL_ENVno se establecerá.fuente
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")Intenta usar
pip -V(nota mayúscula V)Si está ejecutando el entorno virtual. mostrará el camino a la ubicación del entorno.
fuente
virtualenvmucho, es posible que esto pueda fallar o mentirte. Si está mintiendo, puedes hacerlofind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+. Si está fallando (obtuve "datos incorrectos del mariscal"), deberá borrar los archivos .pycfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+(no se preocupe, se reconstruirán automáticamente)....\lib\site-packagesen%PATH%. Entonces devolverá un falso positivo en ese caso.Esta es una mejora de la respuesta aceptada por Carl Meyer . Funciona con virtualenv para Python 3 y 2 y también para el módulo venv en Python 3:
El cheque para
sys.real_prefixcubiertas virtualenv, la igualdad de no vacíassys.base_prefixconsys.prefixcubiertas venv.Considere un script que usa la función de esta manera:
Y la siguiente invocación:
fuente
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix. Sólo digo'.pipenventornos virtuales creados.Verifique la
$VIRTUAL_ENVvariable de entorno.La
$VIRTUAL_ENVvariable de entorno contiene el directorio del entorno virtual cuando se encuentra en un entorno virtual activo.Una vez que ejecuta
deactivate/ abandona el entorno virtual, la$VIRTUAL_ENVvariable se borrará / vaciará. Python generará unKeyErrorporque la variable de entorno no estaba configurada.Estas mismas comprobaciones de variables de entorno, por supuesto, también se pueden hacer fuera del script de Python, en el shell.
fuente
virtualenvvirtualenv como para unvenvvirtualenv.De acuerdo con virtualenv pep en http://www.python.org/dev/peps/pep-0405/#specification , puede usar sys.prefix en lugar de os.environ ['VIRTUAL_ENV'].
sys.real_prefix no existe en mi virtualenv y lo mismo ocurre con sys.base_prefix.
fuente
sys.real_prefix.env |grep VIRTUAL_ENV |wc -lque devolverá un 1 si está en un venv o un 0 si no.[[ -n $VIRTUAL_ENV ]] && echo virtualenvo[[ -z $VIRTUAL_ENV ]] && echo not virtualenvsegún sus necesidades.Para verificar si está dentro de Virtualenv:
También puede obtener más datos sobre su entorno:
fuente
Aquí hay varias buenas respuestas, y algunas menos robustas. Aquí hay una descripción general.
Cómo no hacerlo
No confíe en la ubicación de Python o la
site-packagescarpeta.Si se configuran en ubicaciones no estándar, eso no significa que esté realmente en un entorno virtual. Los usuarios pueden tener más de una versión de Python instalada, y no siempre están donde espera que estén.
Evita mirar:
sys.executablesys.prefixpip -Vwhich pythonAdemás, no se verifique la presencia de
venv,.venvoenvsen cualquiera de estos caminos. Esto se romperá para entornos con una ubicación más única. Por ejemplo, Pipenv usa valores hash como nombre para sus entornos.VIRTUAL_ENVVariable ambientalAmbos
virtualenvyvenvestablecer la variable de entorno$VIRTUAL_ENVal activar un entorno. Ver PEP 405 .Puede leer esta variable en scripts de shell o usar este código de Python para determinar si está configurado.
El problema es que esto sólo funciona cuando el ambiente se activa por el
activatescript de shell.Puede iniciar los scripts del entorno sin activar el entorno , por lo que si eso le preocupa, debe usar un método diferente.
sys.base_prefixvirtualenv,venvY elpyvenvpuntosys.prefixa la de Python instalado en el interior de la virtualenv como era de esperar.Al mismo tiempo, el valor original de
sys.prefixtambién está disponible comosys.base_prefix.Podemos usar eso para detectar si estamos en un virtualenv.
Retroceder:
sys.real_prefixAhora tenga cuidado,
virtualenvantes de que la versión 20 no se configurara,sys.base_prefixsino que se configurabasys.real_prefix.Entonces, para estar seguro, verifique ambos como se sugiere en la respuesta de hroncok :
Anaconda
Si está utilizando entornos virtuales Anaconda, verifique la respuesta de Victoria Stuart .
fuente
running_in_virtualenv = sys.*base_*prefix != sys.prefixif hasattr(sys, 'real_prefix'):prueba, que ya no funcionaba.Puede hacer
which pythony ver si apunta al que está en el entorno virtual.fuente
whichno está disponible por defecto en Windows. En suwherelugar, puede usar en Windows o emplear whichcraft . O mirasys.executable. Pero aún así, hay mejores métodos.Yo uso habitualmente varios entornos virtuales instalados por Anaconda (venv). Este fragmento de código / ejemplos le permite determinar si se encuentra o no en un venv (o en el entorno de su sistema), y también puede requerir un venv específico para su script.
Agregar al script de Python (fragmento de código):
Ejemplo:
Actualización 1 - uso en scripts bash:
También puede usar este enfoque en scripts de bash (por ejemplo, aquellos que deben ejecutarse en un entorno virtual específico). Ejemplo (agregado al script bash):
Actualización 2 [Nov 2019]
Desde mi publicación original, me mudé de Anaconda venv (y Python ha evolucionado en entornos virtuales viz-a-viz ).
Reexaminando este problema, aquí hay un código Python actualizado que puede insertar para probar que está operando en un entorno virtual Python específico (venv).
Aquí hay un código explicativo.
fuente
La forma más fácil es simplemente ejecutar:
which pythonsi está en un virtualenv, apuntará a su pitón en lugar del global.fuente
(editado) Encontré de esa manera, ¿qué piensas de eso? (también devuelve la ruta de base de venv y funciona incluso para readthedocs donde no se verifica la variable env ):
fuente
Ya hay muchos métodos excelentes publicados aquí, pero solo agregando uno más:
te dice dónde están
pipinstalados los paquetes.fuente
site.getsitepackages()genera un directorio que no es el del sistema, puede deducir que se encuentra en un entorno virtual.virtualenv.venvestás usando.No es a prueba de balas, pero para entornos UNIX prueba simple como
funciona muy bien para mi Es más simple que probar los atributos existentes y, de todos modos, debe nombrar su directorio venv
venv.fuente
En el sistema operativo Windows, ve algo como esto:
Los paréntesis significan que en realidad se encuentra en el entorno virtual llamado "virtualEnvName".
fuente
Una posible solución es:
En mi caso, realmente solo quería detectar si podía instalar elementos con pip tal cual. Si bien puede no ser la solución correcta para todos los casos, considere simplemente verificar si tiene permisos de escritura para la ubicación del ejecutable de Python.
Nota: esto funciona en todas las versiones de Python, pero también regresa
Truesi ejecuta el sistema Python consudo. Aquí hay un caso de uso potencial:fuente
Esta es una vieja pregunta, pero muchos ejemplos anteriores son demasiado complicados.
Keep It Simple: (en el terminal Jupyter Notebook o Python 3.7.1 en Windows 10)
fuente
envsesa ruta, dejará de funcionar cuando se mueva de anaconda avirtualenvopipenv.