Makefile导出的环境变量无法被Python脚本读取,求排查原因
问题原因及解决办法
你的问题核心是$(shell)函数的执行时机问题:$(shell)是Make在解析Makefile的阶段就启动子shell执行的,而你通过export VAR := env_var导出的变量,只会传递给规则执行阶段启动的子shell(也就是all目标下那些@开头的命令所在的shell),因此$(shell)启动的Python进程无法读取到这个环境变量。
解决办法1:直接在规则命令中执行Python(推荐)
去掉$(shell)调用,直接在all目标的命令行里运行Python代码,这样Python进程会继承Make导出的环境变量:
export VAR := env_var all: @echo -n "echoing: VAR=" @echo $${VAR} @echo -n "printenv: " @printenv | grep VAR @echo -n "python: " @python -c "import os; print('VAR=' + str(os.environ.get('VAR')))"
运行后即可得到正确的VAR=env_var输出。
解决办法2:若必须使用$(shell)
需要在调用$(shell)时手动将VAR传递到子shell环境中:
VAR := env_var export VAR PY_VAR := python -c "import os; print('VAR=' + str(os.environ.get('VAR')))" all: @echo -n "echoing: VAR=" @echo $${VAR} @echo -n "printenv: " @printenv | grep VAR @echo -n "python: " @echo $(shell VAR=$(VAR) ${PY_VAR})
内容的提问来源于stack exchange,提问作者Quandale Dingle
相关产品推荐
相关产品推荐

