web-dev-qa-db-fra.com

Fonctions virtualenvwrapper non disponibles dans les scripts Shell

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 !?

53
Shrikant Sharat

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

67
mdeous

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
8
Coc B.

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
} 
1
reubano

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 ...
0
jfs

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
0
Aaron

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!

0
Shrikant Sharat

ajoutez ces lignes à votre .bashrc ou .bash_profile

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

et rouvrez votre terminal et essayez

0
Rashi