我在 Windows 11 上的文件夹中有以下
Makefile
.
VENV = test
PYTHON = $(VENV)/Scripts/python
PIP = $(VENV)/Scripts/pip
ACTIVATE = $(VENV)/Scripts/activate
run: $(ACTIVATE)
$(PYTHON) api/app.py
$(ACTIVATE): requirements.txt
py -m venv $(VENV)
$(PIP) install -r requirements.txt
deactivate: $(ACTIVATE)
$(VENV)/deactivate
.PHONY: clean
clean:
rmdir $(VENV) /s /q
rmdir api\__pycache__ /s /q
当我在 PowerShell 上执行
make run
时,它成功地创建了虚拟环境,安装了要求并运行了 app.py。但是,我注意到它没有在虚拟环境中运行。换句话说,它不是在运行前激活环境。
我认为它没有在虚拟环境中运行的原因是因为当我停止应用程序时,命令行不会像通常那样在左侧显示“(test)”。我还检查了一些已安装的软件包,以确保我不在虚拟环境中。
如果我手动完成,我只需输入
test\Scripts\activate
。我试过在执行 api/app.py 之前在运行命令中添加它,但它似乎也没有激活它。我也尝试过here的解决方案,即在执行应用程序之前添加test\Scripts\activate && exec bash
,但exec
不被识别为命令。将 test\Scripts\activate
替换为 $(ACTIVATE)
也不起作用,因为它表示 test
未被识别为命令。
如何确保 api/app.py 在虚拟环境中运行?
我想我会做这样的事情:
VENV = test
PYTHON = $(VENV)/Scripts/python
.PHONY: run
run: $(PYTHON)
$(PYTHON) api/app.py
$(PYTHON): requirements.txt
py -m venv $(VENV)
$(PYTHON) -m pip install --requirement requirements.txt
.PHONY: clean
clean:
rmdir $(VENV) /s /q
rmdir api\__pycache__ /s /q
我认为在
Makefile中使用
activate
和 deactivate
规则是没有意义的,我认为它甚至不会起作用,所以我跳过它们。您在问题中链接的 trick 适用于 Linux 上的 bash,我很确定它不会在 Windows 上运行,而且我想不出可以在 Windows 上运行的解决方案。