You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一目录下存在_nms.so,Python相对导入为何找不到该共享对象?

解决Windows下_nms.so模块导入失败问题

我有一个__init__.py文件,导入语句如下:

from ._nms import lib as _lib, ffi as _ffi

同目录下存在_nms.so共享对象,项目目录结构如下:

├───nms
│   │
│   ├───_ext
│   │   │   __init__.py
│   │   │
│   ├───nms
│   │   │   │   _nms.so
│   │   │   │   __init__.py

从第一个nms文件夹的父目录运行main.py时,出现错误:

Traceback (most recent call last):
  File "main.py", line 43, in <module>
    import model as modellib
  File "C:\proj\model.py", line 26, in <module>
    from nms.nms_wrapper import nms
  File "C:\proj\nms\nms_wrapper.py", line 11, in <module>
    from nms.pth_nms import pth_nms
  File "C:\proj\nms\pth_nms.py", line 2, in <module>
    from ._ext import nms
  File "C:\proj\nms\_ext\nms\__init__.py", line 2, in <module>
    from ._nms import lib as _lib, ffi as _ffi
ModuleNotFoundError: No module named 'nms._ext.nms._nms'

已尝试修改共享对象名称和导入语句,无效。环境是Windows 10,PyTorch已降级到0.4.1。


核心原因

Windows系统不识别.so格式的共享库,Python在Windows下加载的编译扩展模块后缀是.pyd,而非类Unix系统的.so。

解决思路

  • 重命名共享库文件
    将_nms.so直接重命名为_nms.pyd,确保文件与__init__.py处于同一目录下。

  • 重新编译Windows兼容的扩展模块
    原仓库的.so文件是为类Unix系统编译的,Windows下可能存在兼容性问题,建议重新编译:

    1. 安装对应版本的Visual Studio编译工具链(PyTorch 0.4.1建议搭配VS2017)
    2. 找到扩展模块的setup.py脚本,运行以下命令生成.pyd文件:
      python setup.py build_ext --inplace
      
    3. 确保编译时的Python版本、CUDA版本与已安装的PyTorch 0.4.1完全匹配。
  • 修复Python路径问题
    在main.py开头添加代码,将项目根目录加入Python搜索路径,避免模块查找失败:

    import sys
    import os
    sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
    
  • 排查命名空间冲突
    项目中多层nms目录可能导致命名混淆,可尝试修改内层目录名:

    1. 将nms/_ext/nms重命名为nms/_ext/nms_ext
    2. 修改nms/_ext/__init__.py(若有相关导入)和nms/pth_nms.py中的导入语句,对应改为from ._ext import nms_ext as nms
    3. 确保nms/_ext/nms_ext/__init__.py中的导入语句保持from ._nms import lib as _lib, ffi as _ffi

内容的提问来源于stack exchange,提问作者randomdood1923

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 02:58:34