Makefile 创建和 "activate" Python 虚拟环境

Makefile to create and "activate" Python virtual environment

我正在尝试使用 Makefile 创建一个 Python 虚拟环境,并在 make 命令完成后激活它以简化用户操作。显然,这是 not possible 因为 "a child process can not alter the parent's environment." 我想知道是否有任何解决方法。到目前为止,这是我的 Makefile 的一部分: .PHONY: create-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

您可以激活环境和运行激活环境中的shell:

. ${VENV_BIN}/activate && exec bash

(请注意必须在一行中才能在一行中成为shell;exec用于将shell替换为新的。)

当您完成环境工作后退出,然后 Makefile 就完成了。

你可以这样做。

它依赖于您查看 activate 脚本并查看它设置的环境变量,所以它非常丑陋。

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