2011-09-24 3 views
49

Donc, encore une fois, je fais un joli programme python qui rend ma vie toujours plus facile et fait gagner beaucoup de temps. Bien sûr, cela implique un virtualenv, fait avec la fonction mkvirtualenv de virtualenvwrapper. Le projet a un fichier requirements.txt avec quelques bibliothèques requises (requêtes aussi: D) et le programme ne fonctionnera pas sans ces bibliothèques.Fonctions virtualenvwrapper indisponibles dans les scripts shell

J'essaie d'ajouter un script shell exécutable bin/run-app qui serait dans mon chemin (lien symbolique en fait). Maintenant, dans ce script, je dois passer à virtualenv avant de pouvoir exécuter ce programme. Donc, je mets cela dans

#!/bin/bash 
# cd into the project directory 
workon "$(cat .venv)" 
python main.py 

Un fichier .venv contient le nom de virtualenv. Mais quand je lance ce script, j'obtiens l'erreur workon: command not found.

Bien sûr, j'ai le virtualenvwrapper.sh provenant 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 cela dans le mauvais sens? Comment lancez-vous vos outils python, dont chacun a son propre virtualenv !?

Répondre

57

Source Juste le script virtualenvwrapper.sh 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 nommer venv-run.sh par exemple) pour exécuter un script Python dans un virtualenv donné, et le placer dans /usr/bin, /usr/local/bin ou un répertoire qui est dans votre PATH.

Un tel scénario 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

+2

Ceci nécessite un codage en dur de l'emplacement du script virtualenvwrapper.sh, qui dépend du système d'exploitation, parmi beaucoup d'autres choses. –

+0

@ShrikantSharat bien, comme cela est censé être juste un moyen plus facile pour vous d'exécuter des scripts dans un virtualenv (donc seulement sur votre système), il ne devrait pas vraiment être un problème, n'est-ce pas? Si vous vouliez distribuer votre code, je doute que vous demandiez aux utilisateurs d'installer virtualenv et d'en créer un, vous lui donneriez simplement une liste de dépendances à installer. – MatToufoutu

+0

Les * utilisateurs * seraient mes amis techy qui voudraient aussi un virtualenv pour les dépendances de ce programme. Je n'ai pas à leur demander de;) –

0

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 PATH:

pymain -> /path/to/virtualenv/bin/main.py 

Dans bin/app exécuter:

#!/bin/sh 
# cd into the project directory 
pymain arg1 arg2 ... 
+0

Cela fonctionne, mais je n'aime pas mettre le chemin au python de virtualenv dans le #! ligne, se sent un peu sale. En outre, cette étape supplémentaire de création du fichier main.py * à l'intérieur du fichier virtualenv le rend moins portable. Mes amis ne peuvent pas simplement cloner et l'exécuter de moi :) –

+0

@Shrikant Sharat: Si vous écrivez setup.py simple, puis 'pip install' fait pour vous à la fois shebang et copie à virtualenv/bin. Vos amis peuvent simplement: 'pip installer git + ...' s'ils aiment les bords saignants. Notez dans ce cas 'main.py' est copié dans * leur * virtualenv et shebang est écrit pour pointer vers * leur * virtualenv/python. – jfs

+0

@Sebastian, Jamais considéré cette option, mais ça sonne bien. Toute bonne lecture de doc sur ce que vous recommandez (autre que les docs python que je vérifie maintenant), le cas échéant. Merci! –

0

Apparemment, je faisais cela dans le mauvais sens. 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 youpi!

7

Je ne trouve pas le moyen de déclencher les commandes virtualenvwrapper dans shell.Mais cette astuce peut aider: assumer votre env. nom est myenv, puis mettre les lignes suivantes au début des scripts:

ENV=myenv 
source $WORKON_HOME/$ENV/bin/activate 
1

ajouter ces lignes à votre .bashrc ou .bash_profile

export WORKON_HOME=~/Envs 
source /usr/local/bin/virtualenvwrapper.sh 

et ouvrez à nouveau votre terminal et essayez

0

Vous pouvez appelle aussi l'exécutable python de virtualenv directement. D'abord trouver le chemin de l'exécutable:

$ workon myenv 
$ which python 
/path/to/virtualenv/myenv/bin/python 

Ensuite, appelez à partir de votre script shell:

#!/bin/bash 

/path/to/virtualenv/myenv/bin/python myscript.py 
0

Il est un known issue. Pour contourner ce problème, vous pouvez rendre le contenu du script en fonction et le placer dans les deux ~/.bashrc ou ~/.profile

function run-app() { 
    workon "$(cat .venv)" 
    python main.py 
} 
Questions connexes