执行make命令找不到.py后缀Python脚本 报Error 127如何解决
Make构建报错找不到Python脚本(Error 127)解决思路
问题复现
使用如下命令执行后缀为.make的构建文件:
make -f 10.make
核心构建配置内容:
CELLMECH=../cellmech ALL: \ png/01.png \ png/02.png \ png/03.png \ png/04.png \ png/05.png \ png/06.png \ png/07.png \ png/08.png \ png/09.png \ png/10.png pickles/cellMech.10.pickle.gz include ${CELLMECH}/png.make pickles/modLink.01.pickle.gz : stretched-plane.pickle.gz mkdir -p pickles ${CELLMECH}/modLink.py -i $< -o $@ -c conf pickles/cellMech.01.pickle.gz : pickles/modLink.01.pickle.gz ${CELLMECH}/cellMech.py -dt 0.001 -nmax 10000 -i $< -o $@ > /dev/null # 其余规则省略
执行后抛出如下错误:
modLink.py -i stretched-plane.pickle.gz -o pickles/modLink.01.pickle.gz -c conf make: modLink.py: No such file or directory make: *** [10.make:19: pickles/modLink.01.pickle.gz] Error 127
已尝试将配置路径改为绝对路径、修改文件名、重建关联文件,均未解决问题:make可正常识别.make格式的构建文件,但始终无法定位调用的.py后缀Python脚本。
排查&修复方案
按优先级从高到低排查:
- 优先核对变量展开结果:报错信息里实际执行的命令是
modLink.py,完全没有配置里写的${CELLMECH}/路径前缀,说明执行到对应规则时CELLMECH变量被展开为空值。绝大多数这类问题都是被引入的外部make文件覆盖了全局变量:在头部定义
CELLMECH=../cellmech之后,紧接着include了${CELLMECH}/png.make,如果这个png.make文件内部重新给CELLMECH赋了空值、或者重定义了同名变量,会直接覆盖之前的赋值,最终执行命令时路径前缀丢失,make就会去系统PATH环境变量的路径里找modLink.py,找不到就抛出127错误。
排查方法:执行make -p -f 10.make打印所有变量的最终取值,定位CELLMECH在modLink规则执行前的实际值。如果确认是被png.make覆盖,把头部的变量定义改成override CELLMECH := ../cellmech,强制该变量不被后续引入的配置覆盖,或者修改png.make里的同名变量避免冲突。 - 核对相对路径的基准目录:make执行时的工作目录是敲入make命令时所在的目录,不是10.make文件自身存放的目录。如果10.make存放在子目录里,写的
../cellmech是相对于执行make的目录计算的,不是相对于make文件的位置计算,很容易出现路径错误。先手动在执行make的目录下敲ls ../cellmech/modLink.py验证路径是否可达,如果路径不对,要么切换到10.make所在目录再执行命令,要么把CELLMECH改为可靠的绝对路径,也可以通过$(dir $(lastword $(MAKEFILE_LIST)))获取当前make文件的自身路径,拼接得到正确的相对路径。 - 检查脚本执行权限与解释器配置:先给两个Python脚本加可执行权限:
chmod +x ../cellmech/modLink.py ../cellmech/cellMech.py,同时确认脚本第一行有正确的shebang声明(比如#!/usr/bin/env python3)。如果不想调整权限和shebang,直接在make规则里显式指定Python解释器,把命令改成python3 ${CELLMECH}/modLink.py -i $< -o $@ -c conf,绕过直接执行脚本的逻辑,规避权限和解释器找不到的问题。 - 检查命令行缩进:make规则下的所有命令行必须用纯Tab字符缩进,不能用空格代替。如果编辑器开启了Tab自动转空格的功能,make会无法正确识别该行是待执行命令,可能出现变量不展开、命令解析错误的问题,把命令行开头的空格替换为Tab字符即可。
内容的提问来源于stack exchange,提问作者JohnWick9
相关产品推荐
相关产品推荐

