Make报错127:which可定位f2py但执行时提示找不到命令
问题成因
这个问题的坑点在于报错信息有极强的误导性:看到f2py: not found大部分人第一反应是shell搜不到f2py的路径,但你的输出里同一行命令执行的which f2py已经正常返回了/usr/local/bin/f2py,说明PATH配置完全正常,shell已经找到了f2py文件。
真正的故障原因非常常见:/usr/local/bin/f2py本身是个Python写的启动脚本,文件第一行的shebang(就是#!开头用来指定脚本解释器的行)写死了一个不存在的Python路径——比如你之前卸载了旧版本Python、或者f2py是从其他虚拟环境/其他机器拷贝过来的,shebang里的路径早就失效了。内核加载脚本的时候找不到对应的解释器,抛出的错误和"找不到可执行文件本身"的报错完全一模一样,非常容易误判。
如果是权限问题一般会报Permission denied,和你现在的报错不符,可以直接排除。
修复方案
按靠谱程度排序选就行:
- 首选用Python模块方式调用f2py,彻底绕开那个容易坏的启动脚本。把Makefile里直接写
f2py的地方换成python3 -m numpy.f2py就好,只要你当前环境Python装了numpy就能跑,完全不受shebang损坏、PATH配置、软链接失效这些问题影响。改完的规则参考:main : fortran_modules python3 -m numpy.f2py -c --opt="${OPT}" -m fmodules ${SRC} ${FMOD} - 如果你非要用原来的f2py脚本,就直接修它:用文本编辑器打开
/usr/local/bin/f2py,把第一行#!后面的路径改成你系统实际存在的Python路径(用which python3就能查到当前用的Python在哪),保存后执行chmod +x /usr/local/bin/f2py加执行权限就正常了。 - 修之前可以先敲命令验证:直接跑
/usr/local/bin/f2py --version,如果用绝对路径执行都报not found,那100%就是上面说的shebang损坏的问题。 - 别信网上说的什么在Makefile里硬写f2py绝对路径的方法,那方法解决不了shebang损坏的问题,跑了还是会报错,只适合真的PATH没配对的场景,你这个场景用不上。
内容的提问来源于stack exchange,提问作者5Pack
相关产品推荐
相关产品推荐

