¿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.prefix
apunta al directorio virtualenv, ysys.real_prefix
apunta al prefijo "real" del sistema de Python (a menudo/usr
o/usr/local
o algo así).Fuera de un virtualenv,
sys.real_prefix
no debería existir.Usar la
VIRTUAL_ENV
variable de entorno no es confiable. Está configurado por elactivate
script de shell virtualenv , pero un virtualenv puede usarse sin activación ejecutando directamente un ejecutable desde el directorio virtualenvbin/
(oScripts
), en cuyo caso$VIRTUAL_ENV
no 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
virtualenv
mucho, 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-packages
en%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_prefix
cubiertas virtualenv, la igualdad de no vacíassys.base_prefix
consys.prefix
cubiertas 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'.pipenv
entornos virtuales creados.Verifique la
$VIRTUAL_ENV
variable de entorno.La
$VIRTUAL_ENV
variable 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_ENV
variable se borrará / vaciará. Python generará unKeyError
porque 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
virtualenv
virtualenv como para unvenv
virtualenv.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 -l
que devolverá un 1 si está en un venv o un 0 si no.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
o[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
segú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-packages
carpeta.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.executable
sys.prefix
pip -V
which python
Además, no se verifique la presencia de
venv
,.venv
oenvs
en 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_ENV
Variable ambientalAmbos
virtualenv
yvenv
establecer la variable de entorno$VIRTUAL_ENV
al 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
activate
script 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_prefix
virtualenv
,venv
Y elpyvenv
puntosys.prefix
a la de Python instalado en el interior de la virtualenv como era de esperar.Al mismo tiempo, el valor original de
sys.prefix
también está disponible comosys.base_prefix
.Podemos usar eso para detectar si estamos en un virtualenv.
Retroceder:
sys.real_prefix
Ahora tenga cuidado,
virtualenv
antes de que la versión 20 no se configurara,sys.base_prefix
sino 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.prefix
if hasattr(sys, 'real_prefix'):
prueba, que ya no funcionaba.Puede hacer
which python
y ver si apunta al que está en el entorno virtual.fuente
which
no está disponible por defecto en Windows. En suwhere
lugar, 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 python
si 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
pip
instalados los paquetes.fuente
site.getsitepackages()
genera un directorio que no es el del sistema, puede deducir que se encuentra en un entorno virtual.virtualenv
.venv
está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
True
si 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
envs
esa ruta, dejará de funcionar cuando se mueva de anaconda avirtualenv
opipenv
.