Donc, encore une fois, je crée un programme Nice python qui rend ma vie toujours plus facile et fait gagner beaucoup de temps. Bien sûr, cela implique un virtualenv, fait avec le mkvirtualenv
fonction de virtualenvwrapper. Le projet a un fichier requirements.txt avec quelques bibliothèques requises (demandes aussi: D) et le programme ne fonctionnera pas sans ces bibliothèques.
J'essaie d'ajouter un bin/run-app
Script Shell exécutable qui se trouverait sur mon chemin (lien symbolique en fait). Maintenant, à l'intérieur de ce script, je dois basculer vers virtualenv avant de pouvoir exécuter ce programme. J'ai donc mis ça dans
#!/bin/bash
# cd into the project directory
workon "$(cat .venv)"
python main.py
Un fichier .venv
contient le nom virtualenv. Mais lorsque j'exécute ce script, j'obtiens workon: command not found
Erreur.
Bien sûr, le fichier virtualenvwrapper.sh provient de mon bashrc mais il ne semble pas être disponible dans ce script Shell.
Alors, comment puis-je accéder à ces fonctions virtualenvwrapper ici? Ou est-ce que je fais ça mal? Comment lancez-vous vos outils python, chacun ayant son propre virtualenv !?
Source juste le virtualenvwrapper.sh
script dans votre script pour importer les fonctions de virtualenvwrapper. Vous devriez alors pouvoir utiliser la fonction workon
dans votre script.
Et peut-être mieux, vous pouvez créer un script Shell (vous pouvez le nommer venv-run.sh
par exemple) pour exécuter n'importe quel script Python dans un virtualenv donné et le placer dans /usr/bin
, /usr/local/bin
, ou tout répertoire qui se trouve dans votre PATH
.
Un tel script pourrait ressembler à ceci:
#!/bin/sh
# if virtualenvwrapper.sh is in your PATH (i.e. installed with pip)
source `which virtualenvwrapper.sh`
#source /path/to/virtualenvwrapper.sh # if it's not in your PATH
workon $1
python $2
deactivate
Et pourrait être utilisé simplement comme venv-run.sh my_virtualenv /path/to/script.py
Je ne trouve pas le moyen de déclencher les commandes de virtualenvwrapper
dans Shell. Mais cette astuce peut vous aider: assumez votre env. nom est myenv
, puis mettez les lignes suivantes au début des scripts:
ENV=myenv
source $WORKON_HOME/$ENV/bin/activate
C'est un problème conn . Pour contourner ce problème, vous pouvez faire du contenu du script une fonction et le placer dans ~/.bashrc
ou ~/.profile
function run-app() {
workon "$(cat .venv)"
python main.py
}
Si votre script Python nécessite un virtualenv particulier, placez-le/installez-le dans le répertoire bin
de virtualenv. Si vous avez besoin d'accéder à ce script en dehors de l'environnement, vous pouvez créer un lien symbolique.
main.py de bin
de virtualenv:
#!/path/to/virtualenv/bin/python
import yourmodule
if __name__=="__main__":
yourmodule.main()
Lien symbolique dans votre CHEMIN:
pymain -> /path/to/virtualenv/bin/main.py
Dans bin/run-app:
#!/bin/sh
# cd into the project directory
pymain arg1 arg2 ...
Vous pouvez également appeler l'exécutable python de virtualenv directement. Trouvez d'abord le chemin vers l'exécutable:
$ workon myenv
$ which python
/path/to/virtualenv/myenv/bin/python
Appelez ensuite à partir de votre script Shell:
#!/bin/bash
/path/to/virtualenv/myenv/bin/python myscript.py
Apparemment, je faisais ça de la mauvaise façon. Au lieu d'enregistrer le nom de virtualenv dans le fichier .venv, je devrais mettre le chemin du répertoire de virtualenv.
(cdvirtualenv && pwd) > .venv
et dans le bin/run-app
, Je mets
source "$(cat .venv)/bin/activate"
python main.py
Et ouais!
ajoutez ces lignes à votre .bashrc ou .bash_profile
export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh
et rouvrez votre terminal et essayez