【问题标题】:Wheel built with MSVC Cython extension cannot find module使用 MSVC Cython 扩展构建的轮子找不到模块
【发布时间】:2017-10-26 11:09:50
【问题描述】:

我正在尝试从 GNU + mingwpy 切换到 MSVC 工具链来构建我的轮子,其中包括一个围绕二进制文件的 Cython 包装器。

我已经在 Appveyor 中使用 MSVC 工具链构建了外部 DLL,并且在 Appveyor 中,我还完成了轮子构建步骤 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
----------------------------------------------------------------------

see full traceback

cutil.pyd 上运行dumpbin /dependents 似乎符合我的预期:

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:在使用 GNU 工具链构建的 cutil.pyd 上运行 dumpbin 会得到以下结果:

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 部分中的元数据是否重要

【问题讨论】:

  • 只是为了澄清:它适用于 GNU + mingwpy?
  • @DavidW 是的,在我切换二进制文件和 Wheel 构建工具链之前完美运行。

标签: python cython python-wheel


【解决方案1】:

这似乎是 Conda 安装的 virtualenv 的问题。我不知道如何修复它,所以我停止使用 conda 安装的 virtualenv。

【讨论】:

    猜你喜欢
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2021-05-04
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多