在Makefile中通过shell调用Python获取输出时变量为空,是否存在缺失步骤?如何实现预期效果?
这个问题的核心是你误解了把python3设为Make的SHELL后,$(shell)函数的执行逻辑。我来帮你解决:
修正后的Python版Makefile
SHELL:=/usr/bin/env python3 H:=$(shell -c "import os,sys; print(os.getcwd())") install: @print("$H::make.$@: not implemented!")
问题原因&解释
当你把SHELL指定为python3时,Make的$(shell ...)函数会调用python3来执行括号里的内容。但Python不像bash那样会解析命令字符串——它默认把传入的参数当作脚本文件名来执行。你原来的写法$(shell "import ...")相当于让Python去打开一个名为import os,sys; print(os.getcwd(),file=sys.stdout)的文件,这显然不存在,所以没有任何输出,导致$H为空。
而你单独运行python3 -c "import ..."能成功,是因为-c参数告诉Python:“接下来的字符串是要执行的代码,不是文件名”。所以在Make的$(shell)函数里加上-c参数,就能让Python正确执行这段代码并输出当前目录了。
更简洁的替代方案
如果只是规则里的命令需要用Python,$(shell)函数完全可以继续用系统默认的shell(比如bash)来获取路径,这样写法更简单:
SHELL:=/usr/bin/env python3 H:=$(shell pwd) install: @print("$H::make.$@: not implemented!")
两种方法都能让$H正确获取当前工作目录,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

