python - 生成文件中意外标记附近的语法错误
问题描述
我正在尝试在 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
我究竟做错了什么?
解决方案
在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
) 作为配方的最后一个命令可能不会做任何有用的事情。
推荐阅读
- xml - 如果没有正确的属性,XSL 会重复一个值
- .net - 在 .Net Core 中使用 Automapper,如何映射嵌套的外键关系?
- kubernetes - Kubernetes lngress 如何处理 GKE 中的并发请求
- google-bigquery - BigQuery JSON 字段提取
- python - 如何链接到 cython numpy
- reactjs - React hooks:如何在“mount”useEffect 中访问 props 并且不抛出 linting 警告
- sql - SQL:我的 With 语句在 while 循环中不起作用
- sql-server - SQL Server 在不验证脚本的情况下更改存储过程
- recursion - ANTLR 递归替换
- nlp - 如何测量单词共现频率