50 votes

Extension C compilée Cython : ImportError : le module dynamique ne définit pas la fonction d'initialisation

Je viens de compiler une partie de ma bibliothèque C en tant qu'extension en utilisant Cython, en tant que "preuve de concept". J'ai réussi à pirater le code (const corrige les problèmes, etc.), pour enfin obtenir une extension construite.

Cependant, lorsque j'ai tenté d'importer l'extension nouvellement créée, j'ai obtenu l'erreur suivante :

 ImportError: dynamic module does not define init function 

Qu'est-ce que je fais mal et comment puis-je résoudre ce problème ?

J'utilise Cythn 0.11.2 et Python 2.6.5 sur Ubuntu 10.0.4

77voto

Dologan Points 541

J'ai constaté qu'une cause fréquente de ce problème est, lors de l'utilisation d'un fichier d'installation distutils pour compiler le code, que le nom de base .pyx ne correspond pas au nom de l'extension, par exemple :

 ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work

Pour éviter le problème, le nom de l'extension doit être exactement le même, dans ce cas, cython_ext .

36voto

Tim Points 301

Il semble que ce soit un bogue/une fonctionnalité dans Cython. J'ai eu la même chose, mais j'ai simplement ajouté:

 STUFF = "Hi"

en haut de mon fichier .pyx et le problème a disparu. Il apparaît s'il n'y a pas d'initialisation globale (un cinit ou la définition d'une variable globale), que le code d'initialisation requis n'est pas généré.

1voto

Cola_Colin Points 89

Une autre réponse très tardive dans mon cas, j'avais accidentellement appelé cython dans un terminal qui exécutait python2, tout en essayant d'utiliser la bibliothèque générée à partir d'un terminal qui se trouvait sur un autre environnement python, en utilisant python3.

L'utilisation de la même version de python partout l'a corrigé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X