同一目录下存在_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下可能存在兼容性问题,建议重新编译:- 安装对应版本的Visual Studio编译工具链(PyTorch 0.4.1建议搭配VS2017)
- 找到扩展模块的
setup.py脚本,运行以下命令生成.pyd文件:python setup.py build_ext --inplace - 确保编译时的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目录可能导致命名混淆,可尝试修改内层目录名:- 将
nms/_ext/nms重命名为nms/_ext/nms_ext - 修改
nms/_ext/__init__.py(若有相关导入)和nms/pth_nms.py中的导入语句,对应改为from ._ext import nms_ext as nms - 确保
nms/_ext/nms_ext/__init__.py中的导入语句保持from ._nms import lib as _lib, ffi as _ffi
- 将
内容的提问来源于stack exchange,提问作者randomdood1923
相关产品推荐
相关产品推荐

