【问题标题】:Cython Compilation Error: dynamic module does not define module export functionCython 编译错误:动态模块未定义模块导出功能
【发布时间】:2016-08-11 21:59:18
【问题描述】:

我正在 Cython 中构建一个包。我使用以下作为setup.py 的结构:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy
import scipy

extensions = [
    Extension("xxxxx",["xxxx/xxxxx.pyx"],
    include_dirs=[numpy.get_include(),"."]),
    Extension("nnls",["xxxxx/xxxxx.pyx"],
              include_dirs=[numpy.get_include(),"."]),
]

setup(
    name='xxxxxx',
    version='0.0.0',
    description='''********''',
    url='xxxxxxx',
    author='xxxxx',
    author_email='xxxxx',
    packages=[
        'xxxxx',
    ],
    install_requires=[
        'cython',
        'numpy',
        'scipy',
    ],
    ext_modules=cythonize(extensions),
)

但是,我在 Python 3 中安装时遇到错误。它在 Python 2 中运行,但是在 Python 3 中没有编译,出现以下错误:

动态模块没有定义模块导出功能

我该如何解决这个问题? setup.py的结构是这个不编译的原因吗?

【问题讨论】:

    标签: python numpy cython


    【解决方案1】:

    您需要使用 Python 3 调用 setup.py(python3 setup.py build_ext,也许是 --inplace)。这是因为 Python 3 为模块启动时调用的 init 函数定义了不同的名称,因此您需要使用 Python 3 构建它以确保生成正确的名称。

    请参阅dynamic module does not define init function (PyInit_fuzzy)How to specify Python 3 source in Cython's setup.py? 了解更多详细信息(与这些问题的重复,但在我看来并不完全)

    【讨论】:

      【解决方案2】:

      我经历了这个,发现我不得不使用.pyx的同名作为模块名,例如

      制作文件:

      # (default)
      # INSTALL_DIR:=/usr/lib/python3.6/site-packages
      # (my venv)
      INSTALL_DIR:=/home/<username>/python3_venv/lib/python3.6/site-packages
      all:
          sudo python3 setup_myproj.py install --install-lib ${INSTALL_DIR}
      

      setup_myproj.py

      from distutils.core import setup, Extension
      from Cython.Build import cythonize
      
      ext = Extension("myproj",
                      sources=["myproj.pyx", "myCppProjFacade.cpp"],
                      <etc>
                      language="c++"
                     )
      
      setup(name="myproj",
            version="0.0.1",
            ext_modules=cythonize(ext))
      

      客户端模块,安装到venv后运行

      import myproj as myCppProjWrapper
      ...
      

      我还发现如果“myproj”名称不同,&lt;python-lib-dir&gt;/&lt;python-vers&gt;/site-packages下的.so和.egg-info名称不同,客户端加载失败。

      另外我发现客户端的环境不需要安装cython这个包。

      【讨论】:

      • 您能评论一下您使用的操作系统吗?
      • @jxramos Debian Linux
      • 圣洁,这里也一样,不允许更改.so文件的名称
      【解决方案3】:

      torchvision 出现同样的错误。通过降级安装版本修复它:

      pip install torch==1.2.0+cu92 torchvision==0.4.0+cu92 -f https://download.pytorch.org/whl/torch_stable.html
      

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        相关资源
        最近更新 更多