Je souhaite effectuer plusieurs opérations tout en travaillant sur un virtualenv spécifié.
Par exemple, commande
make install
serait équivalent à
source path/to/virtualenv/bin/activate
pip install -r requirements.txt
C'est possible?
Dans make, vous pouvez exécuter une commande Shell as. Dans ce Shell, vous pouvez faire tout ce que vous pouvez faire dans un Shell que vous avez démarré depuis comandline. Exemple:
install:
( \
source path/to/virtualenv/bin/activate; \
pip install -r requirements.txt; \
)
Une attention particulière doit être portée au ;
et le \
.
Tout entre l'accolade ouverte et la fermeture se fera dans une seule instance d'un Shell.
J'aime utiliser quelque chose qui ne fonctionne que lorsque requirements.txt
changements:
venv: venv/bin/activate
venv/bin/activate: requirements.txt
test -d venv || virtualenv venv
. venv/bin/activate; pip install -Ur requirements.txt
touch venv/bin/activate
test: venv
. venv/bin/activate; nosetests project/test
clean:
rm -rf venv
find -iname "*.pyc" -delete
J'ai eu de la chance avec ça.
install:
source ./path/to/bin/activate; \
pip install -r requirements.txt; \
Normalement, make
exécute chaque commande d'une recette dans un sous-shell différent. Cependant, la définition de .ONESHELL:
exécutera toutes les commandes d'une recette dans le même sous-shell, vous permettant d'activer un virtualenv puis d'exécuter des commandes à l'intérieur.
Notez que .ONESHELL:
s'applique à l'ensemble du Makefile, pas seulement à une seule recette. Il peut changer le comportement des commandes existantes, les détails des erreurs possibles dans la documentation complète. Cela ne vous permettra pas d'activer un virtualenv pour une utilisation en dehors du Makefile, car les commandes sont toujours exécutées dans un sous-shell.
Documentation de référence: https://www.gnu.org/software/make/manual/html_node/One-Shell.html
Exemple:
.ONESHELL:
.PHONY: install
install:
source path/to/virtualenv/bin/activate
pip install -r requirements.txt
Il s'agit d'une autre façon d'exécuter les choses que vous souhaitez exécuter dans virtualenv.
BIN=venv/bin/
install:
$(BIN)pip install -r requirements.txt
run:
$(BIN)python main.py
PS: Cela n'active pas le virtualenv, mais fait avancer les choses. J'espère que vous le trouverez propre et utile.
Sur la base des réponses ci-dessus (merci @Saurabh et @oneself!), J'ai écrit un Makefile réutilisable qui prend soin de créer un environnement virtuel et de le maintenir à jour: https://github.com/sio/Makefile.venv
Il fonctionne en référençant les exécutables corrects dans virtualenv et ne s'appuie pas sur le script Shell "activate". Voici un exemple:
test: venv
$(VENV)/python -m unittest
include Makefile.venv
Les différences entre Windows et d'autres systèmes d'exploitation sont prises en compte, Makefile.venv devrait fonctionner correctement sur tout système d'exploitation qui fournit Python et make.
Vous pouvez également utiliser la variable d'environnement appelée "VIRTUALENVWRAPPER_SCRIPT". Comme ça:
install:
( \
source $$VIRTUALENVWRAPPER_SCRIPT; \
pip install -r requirements.txt; \
)