如何在makefile中使用virtualenv

时间:2014-07-14 12:02:50

标签: makefile virtualenv

我想在处理指定的virtualenv时执行几项操作。

例如命令

make install

等同于

source path/to/virtualenv/bin/activate
pip install -r requirements.txt

有可能吗?

8 个答案:

答案 0 :(得分:25)

在make中你可以运行shell作为命令。在这个shell中,您可以在从comandline开始的shell中执行所有操作。例如:

install:
    ( \
       source path/to/virtualenv/bin/activate; \
       pip install -r requirements.txt; \
    )

必须注意;\

open和close大括号之间的所有内容都将在shell的单个实例中完成。

答案 1 :(得分:16)

我喜欢使用仅在requirements.txt更改时运行的内容:

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

答案 2 :(得分:15)

我很幸运。

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

答案 3 :(得分:2)

这是运行您要在virtualenv中运行的内容的另一种方法。

BIN=venv/bin/

install:
    $(BIN)pip install -r requirements.txt

run:
    $(BIN)python main.py

PS:这不会激活virtualenv,但是会完成任务。希望您觉得它干净实用。

答案 4 :(得分:1)

您还可以使用名为“VIRTUALENVWRAPPER_SCRIPT”的环境变量。像这样:

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

答案 5 :(得分:0)

通常make在不同的子Shell中运行配方中的每个命令。但是,设置.ONESHELL:将在同一子外壳中运行配方中的所有命令,从而允许您激活virtualenv,然后在其中运行命令。

请注意,.ONESHELL:适用于整个Makefile,而不仅仅是单个配方。它可能会更改现有命令的行为以及完整文档中可能出现的错误的详细信息。因为命令仍在子外壳程序内运行,所以这不能让您激活在makefile之外使用的virtualenv。

参考文档:https://www.gnu.org/software/make/manual/html_node/One-Shell.html

示例:

.ONESHELL:

.PHONY: install
install:
    source path/to/virtualenv/bin/activate
    pip install -r requirements.txt

答案 6 :(得分:0)

基于上述答案(感谢@Saurabh和@oneself!),我编写了可重用的Makefile,该文件负责创建虚拟环境并保持其更新:https://github.com/sio/Makefile.venv

它通过引用virtualenv中的正确可执行文件来工作,并且不依赖于“激活” shell脚本。这是一个示例:

test: venv
    $(VENV)/python -m unittest

include Makefile.venv

考虑到Windows与其他操作系统之间的差异,Makefile.venv在任何提供Python和make的操作系统上都可以正常工作。

答案 7 :(得分:-2)

你应该使用它,它现在对我有用。

report.ipynb : merged.ipynb
    ( bash -c "source ${HOME}/anaconda3/bin/activate py27; which -a python; \
        jupyter nbconvert \
        --to notebook \
        --ExecutePreprocessor.kernel_name=python2 \
        --ExecutePreprocessor.timeout=3000 \
        --execute merged.ipynb \
        --output=$< $<" )