我正在尝试使用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
答案 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" ))