Makefile创建和“激活” Python虚拟环境

时间:2020-04-08 11:23:44

标签: makefile virtualenv gnu-make

我正在尝试使用Makefile创建一个Python虚拟环境,并在make命令完成后将其激活以减轻用户负担。显然,这是not possible,因为“子进程无法更改父级的环境”。我想知道是否有任何解决方法。到目前为止,这是我的Makefile的一部分: .PHONY:创建venv venv .DEFAULT_GOAL:=全部 SHELL = / bin / bash

CPUTYPE = $(shell uname -m | sed "s/\\ /_/g")
SYSTYPE = $(shell uname -s)
BUILDDIR = build/$(SYSTYPE)-$(CPUTYPE)
VENV_NAME?=venv
VENV_DIR=$(BUILDDIR)/${VENV_NAME}
VENV_BIN=$(shell pwd)/${VENV_DIR}/bin
VENV_ACTIVATE=. ${VENV_BIN}/activate

PYTHON=${VENV_BIN}/python3

create-venv:
    test -d $(BUILDDIR) || mkdir -p $(BUILDDIR)
    which python3 || apt install -y python3 python3-pip
    test -d $(VENV_DIR) || python3 -m venv $(VENV_DIR)

venv: ${VENV_BIN}/activate
${VENV_BIN}/activate: setup.py
    test -d $(VENV_DIR) || make create-venv
    ${PYTHON} -m pip install -r requirements.txt
    touch $(VENV_BIN)/activate
    source ${VENV_BIN}/activate # <- doesn't work
    . ${VENV_BIN}/activate # <- doesn't work either

2 个答案:

答案 0 :(得分:2)

您可以激活环境并在已激活的环境中运行shell:

. ${VENV_BIN}/activate && exec bash

(请注意,它必须在一行中才能在一个shell中运行; exec用于用新的shell替换该shell。)

在环境中使用完后,退出,然后完成Makefile。

答案 1 :(得分:0)

您可以这样做。

它依赖于您查看activate脚本并查看它设置了什么env var,因此它非常难看。

$(eval $(shell source $(PYTHON3_VENV)/bin/activate && echo "export PATH := $$PATH; export PYTHONHOME := $$PYTHONHOME; export VIRTUAL_ENV := $$VIRTUAL_ENV" ))