如何在makefile中使用virtualenv
我想在使用指定的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/
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