在Makefile中

时间:2018-06-18 13:06:07

标签: python makefile virtualenv python-venv

我的Makefile上有以下规则。

init-local-env:
    @echo 'initializing python3 local environment in .venv'
    python3 -m venv .venv && source .venv/bin/activate

但是没有带我到我的虚拟环境。看起来,只有命令的第一部分是由Makefile运行的,因为它创建了.venv文件夹,并且只有在终端上运行source .venv/bin/activate之后,才会将我带到环境中。 / p>

但是,如果我在终端上运行这两个命令,它运行没有问题,它也带我到环境。

python3 -m venv .venv && source .venv/bin/activate

我试图通过引用this question来使用if子句。

init-local-env:
    @echo 'initializing python3 local environment in .venv'
    if [ -z "$$(python3 -m venv .venv)" ]; then \
        source .venv/bin/activate; \
    fi

但它似乎也没有用。它给我以下输出并创建.venv文件夹,但不执行第二个命令。

bash$ make init-local-env
initializing python3 local environment in .venv
if [ -z "$(python3 -m venv .venv)" ]; then \
        source .venv/bin/activate; \
    fi

任何想法,我做错了什么? 我怎么能一个接一个地运行这两个命令(使用&&)?

1 个答案:

答案 0 :(得分:1)

makefile规则的每一行都由一个单独的shell执行。因此,在source .venv/bin/activate执行后,它会终止该shell并在下一行开始一个新的shell而不会产生source .venv/bin/activate的影响。

您可以让GNU make在一个shell中执行所有行,请参阅Using One Shell