web-dev-qa-db-fra.com

Comment utiliser virtualenv dans le makefile

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?

41
dev9

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.

39
Klaus

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
35
oneself

J'ai eu de la chance avec ça.

install:
    source ./path/to/bin/activate; \
    pip install -r requirements.txt; \
15
user2693845

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
6
Holly

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.

5
Saurabh

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.

1
SIO

Vous pouvez également utiliser la variable d'environnement appelée "VIRTUALENVWRAPPER_SCRIPT". Comme ça:

install:
    ( \
       source $$VIRTUALENVWRAPPER_SCRIPT; \
       pip install -r requirements.txt; \
    )
1
hermancaldara