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?
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)