DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
晚安云;香港 CN2 ¥15/月
雨云;给项目一台云服务器

F2PY 已给路径加引号仍找不到文件:参数在内部被再次拆开

F2PY 的部分新选项预处理会把已经分好的 argv 拼接再按空白拆分,含空格的源文件、包含目录或构建目录仍可能损坏。2.5.4 正式实现保留此路径。

Windows 用户目录含空格,调用 F2PY 时已经把源文件路径加上引号,报错里却仍只剩路径的前半段。如果 Python 收到的本来就是一个完整参数,应检查 F2PY 是否在内部重新按空白拆分,而不要继续往命令外层叠引号。

NumPy 2.5.4 的 get_newer_options() 仍会将参数列表先拼成字符串,再调用无参数的 .split()。原本一个参数里的空格随之变成分隔符,含空格的源文件、包含目录和构建目录都可能进入这条问题路径。

Shell 保住的边界,在 Python 内又丢了

例如应用本来传入两个独立参数:-I 与 C:\Users\First Last\include。后者已经是完整路径,但拼接再拆分后,可能变成 C:\Users\First 和 Last\include 两段。

这种预处理不只与某个命令行外壳有关。普通 F2PY 入口与 python -m numpy.f2py 都会进入 Python 参数处理;编译入口也会调用相关预处理。把正常分词的参数重新包进一个长字符串,未必恢复边界,反而可能引入另一层解释。

问题应先与文件确实不存在、权限不足或编译器缺失区分。若完整参数在进入 F2PY 前已经被截断,仍需修正调用方的引用规则;只有边界在此后损坏,才符合这里的条件。

临时使用不含空格的工作路径

不能调整依赖实现时,可在有权限且不含空格的工作目录准备等价输入,并把包含目录、构建输出目录等一并核对。假设该目录已有可信的 fib.f90,只生成接口签名的调用结构可以是:

python -m numpy.f2py -m fib fib.f90 -h fib.pyf

这只生成签名,不代表完成扩展编译。真实构建仍需沿用项目的编译器、依赖和后端参数,不能因为示例不含 -c 就漏掉原有构建步骤。输出应使用新目录或保留原件,避免覆盖已有接口文件。

相对路径也只有在解析后的工作布局与所有相关参数都避开问题条件时才有用。仅移动主源文件,仍把 -I 或 --build-dir 指向含空格的位置,可能继续失败。复制输入时要保留 include 文件的相对关系,不能改完目录后悄悄换了一套源代码。

不在应用里复制私有参数解析器

本题的实现修正应保留已经分好的参数列表,不能简单把所有空格删除;合法文件名中的空格是路径的一部分。也不建议从应用猴子补丁替换整个 F2PY 私有解析函数,这会依赖具体版本的其他选项处理。

验收保留原有命令参数边界、工作目录和编译输入,先确认签名阶段找到正确文件,再核对完整构建的依赖与输出。采用后续正式修正时,还应恢复含空格的原路径做对照,不能只在新无空格目录成功后便宣称所有路径已受支持。