4

在我的 makefile 的顶部,我有这一行:

SHELL := /bin/sh

大多数命令都需要它。但是,我还想有一个 make 命令来激活我的虚拟环境,它位于不同的路径上。

这是我为它编写的代码:

activate:
    source ~/.envs/$(APP)/bin/activate; \

这样做的问题是,这只是打印出这里写的内容,并没有被执行。我读到它可能与只有 bash 知道源代码有关,但我不知道如何在activate命令中临时切换模式。

我将如何编写这个方法,以便它激活我的 virtualenv?

4

3 回答 3

10

它确实会被执行。

Virtualenv 通过修改您当前进程的环境来工作(这就是您必须“获取”它的原因)。但是,一个进程不能修改另一个进程的环境。因此,为了运行你的配方,make 调用一个 shell 并将你的 virtualenv 命令传递给它,它可以工作,然后 shell 退出,你的 virtualenv 就消失了。

简而言之,在生成文件中没有简单的方法可以做到这一点。最简单的做法是创建一个脚本,首先获取 virtualenv 然后运行 ​​make,然后运行它而不是运行 make。

于 2018-05-18T14:25:03.350 回答
6

创建一个名为“make-venv”的文件,如下所示:

#!/bin/bash
source ./.venv/bin/activate
$2

然后将其添加到 Makefile 的第一行

SHELL=./make-venv

现在,在每个命令运行之前make-venv激活。virtualenv可能效率低下,但功能齐全。

于 2018-11-28T16:29:31.900 回答
0

您可以使用set来完成,它允许您设置或取消设置 shell 选项和位置参数的值:

set -a && . venv/bin/activate && set +a

于 2019-10-31T10:13:06.863 回答