首页 > 解决方案 > 生成文件中意外标记附近的语法错误

问题描述

我正在尝试在 Makefile 中创建一个模板以重用 Python virtualenv。在 Makefile 我定义:

ENV_CREATE ?= $(shell python3 -m virtualenv venv) 并在目标:

set_up:
    $(ENV_CREATE) ; \
    . venv/bin/activate

由于 Makefiule 目标执行,我得到

/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `echo created virtual environment CPython3.7.9.final.0-64 in 333ms   creator CPython3Posix(dest=/Users/marian/Work/git/sigma/sphere/sphere-data-platform/venv, clear=False, no_vcs_ignore=False, global=False)   seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/marian/Library/Application Support/virtualenv)     added seed packages: pip==21.1.2, setuptools==57.0.0, wheel==0.36.2   activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator ; . venv/bin/activate    python3 -m pip install -r requirements.txt -r requirements-dev.txt ; '
make: *** [setup] Error 2

我究竟做错了什么?

标签: pythonbashmakefilevirtualenv

解决方案


ENV_CREATE ?= $(shell...)右侧似乎是非递归评估的(即立即)。因此,该ENV_CREATE变量被分配了这个 shell 脚本的结果:[created ....

在您的配方中,您将此 make 变量 ( $(ENV_CREATE)) 的扩展用作 shell 语法,虽然它不是 shell 语法,但它是python3 -m virtualenv venv.

shell在已经是...一个shell脚本的配方中使用make函数绝对没有意义。尝试:

ENV_CREATE ?= python3 -m virtualenv venv

set_up:
    $(ENV_CREATE) ; \
    . venv/bin/activate

Make 将在将配方传递给 shell 之前对其进行扩展。所以将传递给shell的是:

python3 -m virtualenv venv ; . venv/bin/activate

但请注意,将 sourcing ( . venv/bin/activate) 作为配方的最后一个命令可能不会做任何有用的事情。


推荐阅读