Cython编译错误:动态模块未定义模块导出函数

时间:2016-04-19 15:41:04

标签: python numpy cython

我正在使用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的结构是不编译的原因吗?

3 个答案:

答案 0 :(得分:6)

您需要使用Python 3(python3 setup.py build_ext,也许--inplace)调用setup.py。这是因为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?(它接近这些问题的副本,但在我看来并非如此)

答案 1 :(得分:0)

我遇到了这种情况,发现我必须使用与模块名相同的.pyx名称,例如

makefile:

# (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”名称不同,则<python-lib-dir>/<python-vers>/site-packages下的.so和.egg-info名称不同,客户端将无法加载它。

此外,我发现客户端的环境不需要安装cython软件包。

答案 2 :(得分:0)

我对torchvision犯了同样的错误。通过降级安装版本来解决此问题:

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