You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:22:30