如何在makefile中使用virtualenv

如何在makefile中使用virtualenv,makefile,virtualenv,Makefile,Virtualenv,我想在使用指定的virtualenv时执行几个操作 例如命令 make install 相当于 source path/to/virtualenv/bin/activate pip install -r requirements.txt 有可能吗?在make中,您可以以命令的形式运行shell。在这个shell中,您可以在从comandline开始的shell中完成所有可以完成的操作。例如: install: ( \ source path/to/virtualenv/

我想在使用指定的virtualenv时执行几个操作

例如命令

make install
相当于

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

有可能吗?

在make中,您可以以命令的形式运行shell。在这个shell中,您可以在从comandline开始的shell中完成所有可以完成的操作。例如:

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


打开和关闭大括号之间的所有操作都将在shell的单个实例中完成。

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

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

我在这方面运气不错

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

你应该用这个,它现在对我来说很有用

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=$< $<" )
report.ipynb:merged.ipynb
(bash-c“source${HOME}/anaconda3/bin/activate py27;它是python\
朱皮特·恩康维特\
--记\
--executeProcessor.kernel_name=python2\
--ExecuteProcessor.timeout=3000\
--执行merged.ipynb\

--output=$<$我喜欢使用只在
requirements.txt
更改时运行的东西:

这假设源文件位于项目根目录的
project
下,测试位于
project/test
下(您应该更改
project
以匹配实际的项目名称)

  • 运行
    make
    requirements.txt
    中安装软件包
  • 运行
    maketest
    运行测试(如果测试在其他地方,则可以更新此命令)
  • 运行
    makeclean
    删除所有工件

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

请注意,
.ONESHELL:
适用于整个Makefile,而不仅仅是单个配方。它可能会更改现有命令的行为,以及完整文档中可能错误的详细信息。这将不允许您激活virtualenv以在Makefile外部使用,因为这些命令仍在子shell中运行

参考文件:

例如:

.ONESHELL:

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

这是运行您希望在virtualenv中运行的东西的另一种方式

BIN=venv/bin/

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

run:
    $(BIN)python main.py

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

基于以上答案(感谢@Saurabh和@self!),我编写了一个可重用的Makefile,负责创建虚拟环境并保持更新:

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

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

include Makefile.venv

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

不需要
()
在这种情况下。make已经为规则体中的每一行生成了一个新的shell实例。您只需要使用延续标记,让make读取这些行并在单个shell中执行它们,而不是像默认情况下那样在多个shell中执行。@Yukulélé:请不要将我的答案更改为某种程度,这也是作为解决方案发布在这里的.user2693845发布的内容正是您编辑我的答案的内容。Etan的评论已经解释了不需要大括号…我得到了“source:command not found”,因此我最终不得不使用同义词.Ex更改上面的3:`.path/to/virtualenv/bin/activate;`我希望这能帮助其他在这里遇到困难的人:-)/银行标识代码/sh:1:来源:非found@Adil例如,将其添加到makefile的第一行:
SHELL:=/bin/bash
。调整到您使用的SHELL。@Adil,或者使用POSIX dot命令而不是
source
,例如
。/path/to/bin/activate
,这看起来很流畅。有人能更详细地解释一下吗?还有什么其他信息吗你在找吗?我可以添加到答案中。@self应该运行什么来激活什么?如果pip安装失败,这将删除
venv/bin/activate
。最好使用另一个“跟踪文件”。只需更改所有事件(当然,除了寻源)对于像“make”
@zean\u 7更新的
venv/bin/updated\u这样的东西,只要键入
make
就执行makefile中的第一个目标,在本例中是
venv
。由于
venv
依赖于
venv/touchfile
,因此只要提供
requirements.txt
(其依赖性),该配方也会运行已更改。
venv/touchfile
只是一个用于跟踪虚拟环境修改时间的空文件。我认为这是最好的解决方案
test: venv
    $(VENV)/python -m unittest

include Makefile.venv