从Python 2.x迁移至3.x:如何在Makefile中指定Python版本编译单文件?
解决Makefile中指定Python版本运行脚本的问题
你的问题核心在于把Python解释器作为依赖项添加,但实际执行脚本时仍遵循了脚本自身shebang指定的Python版本——依赖项只是告诉Makefile「这个文件存在才触发构建」,并不会改变脚本的运行逻辑。
下面给你几种无需修改系统环境或脚本本身的可行方案:
方案1:显式用指定Python解释器运行脚本(最可靠)
直接在Makefile的命令行里调用你指定的Python版本来执行脚本,完全绕过脚本的shebang配置:
mySuperFile.c : $(ROOT)/lib/mySuperFileGenerate $(FILES_DIR) $(REPO_STATE_FILE) ${PYTHON373} $(ROOT)/lib/mySuperFileGenerate --out-dir=$(OUT_DIR) --repo=$(ROOT) --output=mySuperFile.c
这种方法不管脚本首行写的是什么,都会强制用${PYTHON373}指向的Python 3.7.3版本运行,是最稳妥的方式,不需要修改任何脚本内容。
方案2:临时调整环境变量(可选)
如果你不想修改命令行结构,可以在执行脚本前临时调整PATH,让系统优先找到你的Python3版本:
mySuperFile.c : ${PYTHON373} $(ROOT)/lib/mySuperFileGenerate $(FILES_DIR) $(REPO_STATE_FILE) env PATH=$(dir ${PYTHON373}):$$PATH $(ROOT)/lib/mySuperFileGenerate --out-dir=$(OUT_DIR) --repo=$(ROOT) --output=mySuperFile.c
这里$(dir ${PYTHON373})会提取Python解释器所在的目录,把它放到PATH最前面,这样脚本的#!/usr/bin/env python就会优先找到你指定的Python3版本。不过这种方式依赖env命令,且如果你的Python3解释器命名是python3而非python,还需要调整脚本shebang,通用性不如方案1。
为什么你原来的方法无效?
你之前把${PYTHON373}加到依赖列表里,只是告诉Makefile:当${PYTHON373}这个文件更新时,需要重新构建mySuperFile.c。但执行脚本的逻辑完全没有改变——脚本还是通过自身的shebang#!/usr/bin/env python去系统默认路径找Python,自然还是调用Python2.x版本。
内容的提问来源于stack exchange,提问作者Hardwired
相关产品推荐
相关产品推荐

