【发布时间】:2014-09-04 08:19:12
【问题描述】:
我想在指定的 virtualenv 上执行几个操作。
例如命令
make install
相当于
source path/to/virtualenv/bin/activate
pip install -r requirements.txt
有可能吗?
【问题讨论】:
标签: makefile virtualenv
我想在指定的 virtualenv 上执行几个操作。
例如命令
make install
相当于
source path/to/virtualenv/bin/activate
pip install -r requirements.txt
有可能吗?
【问题讨论】:
标签: makefile virtualenv
在 make 中,您可以将 shell 作为命令运行。在这个 shell 中,您可以在从命令行开始的 shell 中做所有可以做的事情。示例:
install:
( \
source path/to/virtualenv/bin/activate; \
pip install -r requirements.txt; \
)
注意;和\。
左大括号和右大括号之间的所有内容都将在一个 shell 实例中完成。
【讨论】:
()。 make 已经为规则正文中的每一行生成了一个新的 shell 实例。您只需要使用继续标记来读取行并在单个 shell 中执行它们,而不是像默认情况下那样在多个 shell 中执行。
您也可以使用名为“VIRTUALENVWRAPPER_SCRIPT”的环境变量。像这样:
install:
( \
source $$VIRTUALENVWRAPPER_SCRIPT; \
pip install -r requirements.txt; \
)
【讨论】:
我很幸运。
install:
source ./path/to/bin/activate; \
pip install -r requirements.txt; \
【讨论】:
SHELL := /bin/bash。调整到您使用的任何外壳。
source,如. ./path/to/bin/activate
你应该使用它,它现在对我有用。
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=$< $<" )
【讨论】:
我喜欢使用仅在 requirements.txt 更改时运行的东西:
这假定源文件位于项目根目录中的project 下,并且测试位于project/test 下。 (您应该更改 project 以匹配您的实际项目名称。)
venv: venv/touchfile
venv/touchfile: requirements.txt
test -d venv || virtualenv venv
. venv/bin/activate; pip install -Ur requirements.txt
touch venv/touchfile
test: venv
. venv/bin/activate; nosetests project/test
clean:
rm -rf venv
find -iname "*.pyc" -delete
make 在requirements.txt 中安装软件包。make test 运行您的测试(如果您的测试在其他地方,您可以更新此命令)。make clean 删除所有工件。【讨论】:
venv/bin/activate。最好使用另一个“跟踪文件”。只需将所有出现(当然,除了采购之外)更改为 venv/bin/updated_by_make
make 即可执行makefile 中的第一个目标,在本例中为venv。由于venv 依赖于venv/touchfile,因此该配方也会运行,前提是requirements.txt(其依赖项)已更改。 venv/touchfile 只是一个空文件,用于跟踪虚拟环境的修改时间。
通常make 在不同的子shell 中运行配方中的每个命令。但是,设置.ONESHELL: 将在同一个子shell 中运行一个配方中的所有命令,允许您激活一个virtualenv,然后在其中运行命令。
请注意,.ONESHELL: 适用于整个 Makefile,而不仅仅是单个配方。它可能会改变现有命令的行为,以及完整文档中可能出现的错误的详细信息。这不会让您激活一个在 Makefile 之外使用的 virtualenv,因为这些命令仍然在子 shell 中运行。
参考文档: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
【讨论】:
这是运行您想在 virtualenv 中运行的东西的另一种方法。
BIN=venv/bin/
install:
$(BIN)pip install -r requirements.txt
run:
$(BIN)python main.py
PS:这不会激活 virtualenv,但可以完成任务。希望你觉得它干净实用。
【讨论】:
根据上面的答案(感谢@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 的操作系统上正常工作。
【讨论】: