web-dev-qa-db-fra.com

Erreur de compilation Cython: le module dynamique ne définit pas la fonction d'exportation de module

Je construis un package en Cython. J'utilise ce qui suit comme structure pour 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),
)

Cependant, je reçois une erreur lors de l'installation dans Python 3. Il fonctionne dans Python 2 cependant, il ne compile pas dans Python 3 ayant l'erreur suivante:

le module dynamique ne définit pas la fonction d'exportation de module

Comment puis-je résoudre ce problème? Est la structure du setup.py la raison pour laquelle cela ne se compile pas?

13
Alger Remirata

Vous devez appeler setup.py avec Python 3 (python3 setup.py build_ext, peut être --inplace). C'est parce que Python 3 définit un nom différent pour la fonction init appelée lorsque le module démarre, et donc vous devez le construire en utilisant Python 3 pour vous assurer que le nom correct est généré.

Voir le module dynamique ne définit pas la fonction init (PyInit_fuzzy) et Comment spécifier Python 3 source dans setup.py? de Cython pour un peu plus) détail (il est à la limite d'un double de ces questions, mais n'est pas tout à fait à mon avis)

6
DavidW