无法从 python makefile 激活 venv

问题描述 投票:0回答:1

我有以下 python makefile。

.ONESHELL:

TEST_DIR = ./tests
DIR_NAME = $(shell date "+%Y-%m-%d_%T")

.PHONY: clean test backup env

env:
    . .venv/bin/activate

test: env clean
    pytest --cache-clear --cov -p no:logging --html=report.html --self-contained-html -n 8 --maxprocesses=8 $(TEST_DIR)

backup: 
    mkdir -p ./backup_test_results
    cd ./backup_test_results
    mkdir $(DIR_NAME) && cd $(DIR_NAME)
    find . -name htmlcov -type d -exec cp -r '{}' ./ \;
    find . \( -name "error.log" -o -name "download.log" -o -name ".coverage*" -o -name "report.html" \) -type f -exec cp '{}' ./ \;
    cd ../../

clean: backup
    find . -path ./.venv -prune -o \( -name __pycache__ -o -name .pytest_cache  -o -name htmlcov \) -type d -exec rm -rf '{}' \;
    find . \( -name "error.log" -o -name "download.log" -o -name ".coverage*" -o -name "report.html" \) -type f -delete

使用

.ONESHELL
命令按预期创建目录。但虚拟环境没有被激活。

运行 make 文件时,出现错误,提示未找到 pytest。因此,我假设虚拟环境未激活。

我做错了什么?

python-3.x makefile zsh
1个回答
0
投票

.ONESHELL
并不意味着 make 在 make 的整个运行过程中启动一个 shell,并以某种方式将所有配方中的所有命令传递到该一个 shell(这是不可能的,因为 make 需要知道每个配方的退出代码了解规则是否成功)。

.ONESHELL
表示每个单独配方中的所有行都传递到单个 shell:默认情况下,每个单独配方中的每个单独行都传递到单独的 shell。

因此,即使使用

.ONESHELL
,您也无法在不同配方之间共享 shell 环境设置。你可以这样做:

.ONESHELL:

SETVENV = . .venv/bin/activate

test: clean
        $(SETVENV)
        pytest --cache-clear --cov -p no:logging --html=report.html --self-contained-html -n 8 --maxprocesses=8 $(TEST_DIR)

(例如,将

$(SETVENV)
变量添加到每个配方中。)

© www.soinside.com 2019 - 2024. All rights reserved.