使用 MSVC Cython 扩展构建的 Wheel 找不到模块
Wheel built with MSVC Cython extension cannot find module
我正在尝试从 GNU + mingwpy 切换到 MSVC 工具链来构建我的轮子,其中包括围绕二进制文件的 Cython 包装器。
我已经在 Appveyor 中使用 MSVC 工具链构建了外部 DLL,而且,同样在 Appveyor 中,我得到了 wheel 构建步骤 working。构建步骤完成后,我通过执行以下操作进行测试:
- 安装并激活一个干净的 virtualenv
- 正在安装依赖项
- 安装我刚造的轮子
- 运行
nosetests wheelname
但是,现在失败了:
======================================================================
ERROR: Failure: ImportError (No module named cutil)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Miniconda\envs\test_env\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName
addr.filename, addr.module)
File "C:\Miniconda\envs\test_env\lib\site-packages\nose\importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "C:\Miniconda\envs\test_env\lib\site-packages\nose\importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "C:\projects\simplification\simplification\test\test.py", line 5, in <module>
from simplification.cutil import simplify_coords as csimplify_coords
ImportError: No module named cutil
----------------------------------------------------------------------
运行 dumpbin /dependents
on cutil.pyd
似乎显示了我的预期:
Dump of file simplification/cutil.pyd
File Type: DLL
Image has the following dependencies:
rdp.dll
python27.dll
MSVCR90.dll
KERNEL32.dll
Summary
4000 .data
2000 .rdata
3000 .reloc
12000 .text
其中 rdp.dll
是我用 Cython 包装的外部二进制文件。
这里出了什么问题?
更新:我的模块还可以使用 Ctypes
导入二进制文件,当我在测试脚本中禁用特定于 Cython 的导入和测试时,一切正常。所以我知道我的外部二进制文件没问题。我仍然对 为什么 导入失败感到困惑,尤其是当 cutil.pyd
的 Cython 构建步骤完成时,并且 dumpbin 说它正在寻找它的 rdp.dll
依赖在正确的地方(即在同一目录中)。
更新 2:运行 dumpbin
on cutil.pyd
使用 GNU 工具链构建的内容如下:
Dump of file simplification/cutil.pyd
File Type: DLL
Image has the following dependencies:
msvcr90.dll
python27.dll
KERNEL32.dll
USER32.dll
rdp.dll
Summary
1000 .CRT
1000 .bss
3000 .data
1000 .edata
2000 .idata
1000 .pdata
4000 .rdata
1000 .reloc
1000 .rsrc
1E000 .text
1000 .tls
1000 .xdata
但我不知道依赖顺序是否重要或 Summary
部分中的元数据是否重要
这似乎是 Conda 安装的 virtualenv 的问题。我不知道如何修复它,所以我停止使用 conda 安装的 virtualenv。
我正在尝试从 GNU + mingwpy 切换到 MSVC 工具链来构建我的轮子,其中包括围绕二进制文件的 Cython 包装器。
我已经在 Appveyor 中使用 MSVC 工具链构建了外部 DLL,而且,同样在 Appveyor 中,我得到了 wheel 构建步骤 working。构建步骤完成后,我通过执行以下操作进行测试:
- 安装并激活一个干净的 virtualenv
- 正在安装依赖项
- 安装我刚造的轮子
- 运行
nosetests wheelname
但是,现在失败了:
======================================================================
ERROR: Failure: ImportError (No module named cutil)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Miniconda\envs\test_env\lib\site-packages\nose\loader.py", line 418, in loadTestsFromName
addr.filename, addr.module)
File "C:\Miniconda\envs\test_env\lib\site-packages\nose\importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "C:\Miniconda\envs\test_env\lib\site-packages\nose\importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "C:\projects\simplification\simplification\test\test.py", line 5, in <module>
from simplification.cutil import simplify_coords as csimplify_coords
ImportError: No module named cutil
----------------------------------------------------------------------
运行 dumpbin /dependents
on cutil.pyd
似乎显示了我的预期:
Dump of file simplification/cutil.pyd
File Type: DLL
Image has the following dependencies:
rdp.dll
python27.dll
MSVCR90.dll
KERNEL32.dll
Summary
4000 .data
2000 .rdata
3000 .reloc
12000 .text
其中 rdp.dll
是我用 Cython 包装的外部二进制文件。
这里出了什么问题?
更新:我的模块还可以使用 Ctypes
导入二进制文件,当我在测试脚本中禁用特定于 Cython 的导入和测试时,一切正常。所以我知道我的外部二进制文件没问题。我仍然对 为什么 导入失败感到困惑,尤其是当 cutil.pyd
的 Cython 构建步骤完成时,并且 dumpbin 说它正在寻找它的 rdp.dll
依赖在正确的地方(即在同一目录中)。
更新 2:运行 dumpbin
on cutil.pyd
使用 GNU 工具链构建的内容如下:
Dump of file simplification/cutil.pyd
File Type: DLL
Image has the following dependencies:
msvcr90.dll
python27.dll
KERNEL32.dll
USER32.dll
rdp.dll
Summary
1000 .CRT
1000 .bss
3000 .data
1000 .edata
2000 .idata
1000 .pdata
4000 .rdata
1000 .reloc
1000 .rsrc
1E000 .text
1000 .tls
1000 .xdata
但我不知道依赖顺序是否重要或 Summary
部分中的元数据是否重要
这似乎是 Conda 安装的 virtualenv 的问题。我不知道如何修复它,所以我停止使用 conda 安装的 virtualenv。