Est-il possible de déterminer si le script actuel s'exécute dans un environnement virtualenv?
python
virtualenv
miracle2k
la source
la source
Réponses:
AFAIK le moyen le plus fiable de vérifier cela (et la manière qui est utilisée en interne dans virtualenv et dans pip) est de vérifier l'existence de
sys.real_prefix
:À l'intérieur d'un virtualenv,
sys.prefix
pointe vers le répertoire virtualenv etsys.real_prefix
pointe vers le "vrai" préfixe du système Python (souvent/usr
ou/usr/local
ou quelque).En dehors d'un virtualenv,
sys.real_prefix
ne devrait pas exister.L'utilisation de la
VIRTUAL_ENV
variable d'environnement n'est pas fiable. Il est défini par leactivate
script shell virtualenv , mais un virtualenv peut être utilisé sans activation en exécutant directement un exécutable à partir du répertoire virtualenvbin/
(ouScripts
), auquel cas$VIRTUAL_ENV
il ne sera pas défini.la source
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Essayez d'utiliser
pip -V
(notez la majuscule V)Si vous exécutez l'environnement virtuel. il montrera le chemin vers l'emplacement de l'env.
la source
virtualenv
, il est possible que cela vous échoue ou vous mente. S'il ment, vous pouvez le fairefind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Si cela échoue (j'ai "de mauvaises données de marshal"), vous devrez effacer les fichiers .pyc avecfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(ne vous inquiétez pas, ils se reconstruiront automatiquement)....\lib\site-packages
dans le%PATH%
. Il retournera donc un faux positif dans ce cas.Il s'agit d'une amélioration de la réponse acceptée par Carl Meyer . Il fonctionne avec virtualenv pour Python 3 et 2 et également pour le module venv dans Python 3:
La vérification des
sys.real_prefix
couvertures virtualenv, l'égalité des non-videssys.base_prefix
avec lessys.prefix
couvertures venv.Considérez un script qui utilise la fonction comme ceci:
Et l'invocation suivante:
la source
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Je dis juste.pipenv
les environnements virtuels créés.Vérifiez la
$VIRTUAL_ENV
variable d'environnement.La
$VIRTUAL_ENV
variable d'environnement contient le répertoire de l'environnement virtuel dans un environnement virtuel actif.Une fois que vous exécutez
deactivate
/ quittez l'environnement virtuel, la$VIRTUAL_ENV
variable sera effacée / vide. Python lèvera unKeyError
car la variable d'environnement n'a pas été définie.Ces mêmes vérifications de variables d'environnement peuvent bien sûr également être effectuées en dehors du script Python, dans le shell.
la source
virtualenv
virtualenv et unvenv
virtualenv.Selon le pep virtualenv sur http://www.python.org/dev/peps/pep-0405/#specification, vous pouvez simplement utiliser sys.prefix à la place os.environ ['VIRTUAL_ENV'].
le sys.real_prefix n'existe pas dans mon virtualenv et pareil avec sys.base_prefix.
la source
sys.real_prefix
.env |grep VIRTUAL_ENV |wc -l
qui retournera un 1 si dans un venv ou un 0 sinon.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
ou[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
selon vos besoins.Pour vérifier si votre Virtualenv intérieur:
Vous pouvez également obtenir plus de données sur votre environnement:
la source
Il y a plusieurs bonnes réponses ici, et certaines moins robustes. Voici un aperçu.
Comment ne pas le faire
Ne vous fiez pas à l'emplacement de Python ou
site-packages
dossier.Si ceux-ci sont définis sur des emplacements non standard, cela ne signifie pas que vous êtes réellement dans un environnement virtuel. Les utilisateurs peuvent avoir plus d'une version Python installée, et ce n'est pas toujours là où vous vous attendez.
Évitez de regarder:
sys.executable
sys.prefix
pip -V
which python
En outre, ne vérifie pas la présence de
venv
,.venv
ouenvs
dans l' un de ces chemins. Cela se cassera pour les environnements avec un emplacement plus unique. Par exemple, Pipenv utilise des valeurs de hachage comme nom pour ses environnements.VIRTUAL_ENV
variable d'environnementLes deux
virtualenv
etvenv
définissent la variable d'environnement$VIRTUAL_ENV
lors de l'activation d'un environnement. Voir PEP 405 .Vous pouvez lire cette variable dans des scripts shell ou utiliser ce code Python pour déterminer si elle est définie.
Le problème est que cela ne fonctionne que lorsque l'environnement est activé par le
activate
script shell.Vous pouvez démarrer les scripts de l'environnement sans activer l'environnement , donc si c'est un problème, vous devez utiliser une méthode différente.
sys.base_prefix
virtualenv
,venv
Et lepyvenv
pointsys.prefix
à Python installé à l' intérieur de l'virtualenv que vous attendez.Dans le même temps, la valeur d' origine de
sys.prefix
est également disponible en tant quesys.base_prefix
.Nous pouvons l'utiliser pour détecter si nous sommes dans un virtualenv.
Se retirer:
sys.real_prefix
Attention maintenant,
virtualenv
avant que la version 20 ne soit pas définie,sys.base_prefix
mais elle est définie à lasys.real_prefix
place.Donc, pour être sûr, vérifiez les deux comme suggéré dans la réponse de hroncok :
Anaconda
Si vous utilisez des environnements virtuels Anaconda, vérifiez la réponse de Victoria Stuart .
la source
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
test, qui ne fonctionnait plus.Vous pouvez faire
which python
et voir si son pointage vers celui dans env virtuel.la source
which
n'est pas disponible par défaut sous Windows. Vous pouvez utiliser à lawhere
place sur Windows ou utiliser quel artisanat . Ou regardezsys.executable
. Mais encore, il existe de meilleures méthodes.J'utilise régulièrement plusieurs environnements virtuels installés par Anaconda (venv). Cet extrait de code / exemples vous permet de déterminer si vous êtes ou non dans un venv (ou votre environnement système), et d'exiger également un venv spécifique pour votre script.
Ajouter au script Python (extrait de code):
Exemple:
Mise à jour 1 - utilisation dans les scripts bash:
Vous pouvez également utiliser cette approche dans les scripts bash (par exemple, ceux qui doivent s'exécuter dans un environnement virtuel spécifique). Exemple (ajouté au script bash):
Mise à jour 2 [novembre 2019]
Depuis mon article d'origine, je suis passé d'Anaconda venv (et Python lui-même a évolué dans des environnements virtuels à savoir ).
En réexaminant ce problème, voici du code Python mis à jour que vous pouvez insérer pour tester que vous travaillez dans un environnement virtuel Python spécifique (venv).
Voici un code explicatif.
la source
Le moyen le plus simple est de simplement lancer:
which python
si vous êtes dans un virtualenv, il pointera vers son python au lieu du globalla source
(édité) J'ai trouvé ça, qu'en pensez-vous? (il retourne également le chemin de base de venv et fonctionne même pour les documents de lecture où la vérification de la variable env ne fonctionne pas):
la source
Il y a déjà beaucoup de bonnes méthodes publiées ici, mais en ajoutant juste une de plus:
vous indique où sont
pip
installés les packages.la source
site.getsitepackages()
génère un répertoire qui n'est pas celui du système, vous pouvez en déduire que vous êtes dans un environnement virtuel.virtualenv
.venv
vous utilisez.Ce n'est pas à l'épreuve des balles mais pour les environnements UNIX, test simple comme
fonctionne très bien pour moi. C'est plus simple que de tester un attribut existant et, de toute façon, vous devez nommer votre répertoire venv
venv
.la source
Dans Windows OS, vous voyez quelque chose comme ceci:
Les parenthèses signifient que vous êtes réellement dans l'environnement virtuel appelé "virtualEnvName".
la source
Une solution potentielle est:
Dans mon cas, je voulais juste détecter si je pouvais installer des éléments avec pip tel quel. Bien que ce ne soit pas la bonne solution dans tous les cas, pensez simplement à vérifier si vous avez des autorisations d'écriture pour l'emplacement de l'exécutable Python.
Remarque: cela fonctionne dans toutes les versions de Python, mais renvoie également
True
si vous exécutez le système Python avecsudo
. Voici un cas d'utilisation potentiel:la source
C'est une vieille question, mais trop d'exemples ci-dessus sont trop compliqués.
Keep It Simple: (dans Jupyter Notebook ou le terminal Python 3.7.1 sur Windows 10)
la source
envs
dans ce chemin, cela cessera de fonctionner lorsque vous passerez d’anaconda àvirtualenv
oupipenv
.