Comment créer un script Bash pour activer un virtualenv Python?
J'ai une structure de répertoires comme:
.env
bin
activate
...other virtualenv files...
src
shell.sh
...my code...
Je peux activer mon virtualenv en:
user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$
Cependant, faire la même chose à partir d'un script Bash ne fait rien:
user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$
Qu'est-ce que je fais mal?
python
bash
virtualenv
Cerin
la source
la source
source
est de changer quelque chose dans le shell actuel. Vous pouvez utiliser le python de virtualenv en utilisant le chemin complet./env/bin/python
.Réponses:
Lorsque vous vous approvisionnez, vous chargez le script d'activation dans votre shell actif.
Lorsque vous le faites dans un script, vous le chargez dans ce shell qui se termine lorsque votre script se termine et que vous êtes de retour à votre shell d'origine non activé.
Votre meilleure option serait de le faire dans une fonction
ou un alias
J'espère que cela t'aides.
la source
Vous devez appeler le script bash en utilisant source.
Voici un exemple:
Sur votre shell, appelez-le comme ça:
Ou comme @outmind l'a suggéré: (Notez que cela ne fonctionne pas avec zsh)
Là vous allez, l'indication shell sera placée sur votre invite.
la source
source "/home/surest/Desktop/testservers/TEST_VENV/venv3/bin/activate"
produit:/home/surest/Desktop/testservers/TEST_VENV/py3.sh: 10: /home/surest/Desktop/testservers/TEST_VENV/py3.sh: source: not found
which source
à l'invite du shell, maissource venv3/bin/activate
fait ce que j'attends et ouvre le venv. ...source ./env/bin/activate
(avec le même#!/bin/bash
préfixe)? Quelle est la différence entre utiliser des guillemets et non?source ./env/bin/activate
parce que cela est relatif au chemin que vous utilisez, n'est-ce pas? Si vous modifiez le répertoire à l'intérieur du script, vous pouvez devenir relatif.Bien qu'il n'ajoute pas le préfixe "(.env)" à l'invite du shell, j'ai trouvé que ce script fonctionne comme prévu.
par exemple
la source
/bin/bash
en/usr/bin/env bash
deactivate
du sous-shell avecexit
ou Ctrl + dLe sourcing exécute des commandes shell dans votre shell actuel. Lorsque vous vous approvisionnez à l'intérieur d'un script comme vous le faites ci-dessus, vous affectez l'environnement de ce script, mais lorsque le script se termine, les changements d'environnement sont annulés, car ils sont effectivement sortis de la portée.
Si votre intention est d'exécuter des commandes shell dans virtualenv, vous pouvez le faire dans votre script après avoir extrait le script d'activation. Si votre intention est d'interagir avec un shell à l'intérieur de virtualenv, vous pouvez alors générer un sous-shell dans votre script qui hériterait de l'environnement.
la source
Voici le script que j'utilise souvent. Exécutez-le comme
$ source script_name
la source
À quoi sert le sourcing du script bash?
Si vous avez l'intention de basculer entre plusieurs virtualenv ou d'entrer rapidement un virtualenv, avez-vous essayé
virtualenvwrapper
? Il fournit de nombreux outils commeworkon venv
,mkvirtualenv venv
etc.Si vous exécutez simplement un script python dans certains virtualenv, utilisez
/path/to/venv/bin/python script.py
pour l'exécuter.la source
workon ...
partir d'un script bash. (Parce que je veux exécuter d'autres choses par la suite à chaque fois au démarrage.) Je ne trouve pas de moyen de le faire fonctionner, cependant.Vous pouvez également le faire en utilisant un sous-shell pour mieux contenir votre utilisation - voici un exemple pratique:
Ce style est particulièrement utile lorsque
commandA
oucommandC
existe sous/opt/bin
commandB
existe dans le systèmePATH
ou est très courantla source
$(...)
ou il vous manquera des espaces et des tabulations contenus dans la sortie."${VAR}"
est strictement équivalent au fait que"$VAR"
vous n'avez pas besoin de parenthèses autour des variables shell car les guillemets doubles sont en fait plus puissants. L'exception est lors de l'utilisation de modificateurs comme par exemple"${VAR:-default_value}"
PATH=$PATH:/opt/bin
a besoin de citations appropriées pour gérer les chemins avec des espaces et des tabulations.edit
bouton ci-dessous pour leur suggérer des changements! De plus, sachez que même si c'est souvent une exigence et une importance pour la sécurité, quiconque ajoute sciemment desIFS
charsPATH
est un terroriste.Vous devez utiliser plusieurs commandes sur une seule ligne. par exemple:
lorsque vous activez votre environnement virtuel sur une seule ligne, je pense qu'il oublie les autres lignes de commande et vous pouvez éviter cela en utilisant plusieurs commandes sur une seule ligne. Cela a fonctionné pour moi :)
la source
Quand j'apprenais venv, j'ai créé un script pour me rappeler comment l'activer.
Cela présente l'avantage de modifier l'invite.
la source