运行 Python 来自具有特定环境的品牌

Running Python from a make with a specific enviroment

我编写了一个用于 运行 Python 代码的 makefile。这个想法是它将允许我 运行 我的 linter、pytest 和 运行 代码全部在一个命令中。重要的是,它还会启动一个 python 环境供使用。

摘录如下:

VENV := venv

all: venv

$(VENV)/bin/activate: requirements.txt
    python3 -m venv $(VENV)
    ./$(VENV)/bin/pip install -r requirements.txt

# venv is a shortcut target
venv: $(VENV)/bin/activate

run: venv
    flake8 --exclude=venv
    pytest --ignore=venv
    mypy advent_of_code/dayone.py
    python advent_of_code/dayone.py

其余代码可在此处找到:https://github.com/andrewblance/advent_of_code_2020

但是,当我 运行 我的代码时,我认为它没有使用这个环境。我认为它仍然使用我的默认 python 环境。当我 运行 这段代码时,我可以看到正在使用的 Pytest 和 mypy 的版本取决于默认 python 环境中安装的内容。

我是不是做错了什么,这意味着当我 运行 flake 等时我不使用新环境?我怎样才能改变它,让它只使用 makefile 中指定的环境,以及如何在完成后“关闭”环境?

短:你不能。

更长:每个进程都有自己的环境。它的环境继承自启动它的进程。但是,子进程不可能修改或更改其父进程的环境。

每个命令都是一个过程。所以make程序是一个进程,make调用的每一个命令行都是一个进程。因此,当您 运行 启动 shell 进程的命令 python3 -m venv $(VENV) 时,运行s python3 -m venv ... 是另一个进程。然后 python3 对环境所做的任何更改都会在 python3 退出时丢失,而在 shell 中对环境所做的任何更改都将在 python3 启动时丢失23=] 退出,然后其他 shell 使用其他命令启动,当所有命令完成后,make 将退出,并且当您返回 [时对其环境所做的任何更改都将丢失=23=]提示。