2011-07-27 17 views
5

He escrito una biblioteca en C. Utilizo SWIG para generar enlaces para Java, Python, etc. Me las arreglé para escribir mapas de tipos personalizados para ambos idiomas y así sucesivamente. También logré usar mi biblioteca (un protocolo personalizado) y comunicarme con un servidor que escribí en C, con un cliente que escribí en Java y con un cliente que estoy escribiendo en Python.SWIG y Python3 Error de importación

Recientemente, me encontré con un problema de herencia múltiple con un solution que encontré inteligente. Pero, al intentar replicar el error usando Python 3, el error desapareció (quizás en la versión 3 está resuelto). El hecho es que, el mismo código, el mismo proyecto y la misma fuente no se ejecutarán invocando python3 binario, pero funciona invocando python2.7 binary.

recibo el mensaje:

ImportError: dynamic module does not define init function (PyInit__pytellapic) 

que ya leí lo que podría significar a partir de la documentación TRAGO con un error ligeramente diferente:

import example 
Traceback (most recent call last): 
File "<stdin>", line 1, in ? 
ImportError: dynamic module does not define init function (init_example) 

Decir que:

This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

Honestamente , Creo que estas causas probables no se aplicarán a mis módulos, ya que debería ser un error para 2. 7 y 3 versiones de python, no solo para Python 3.

Agradecería cualquier consejo, pero teniendo en cuenta que SWIG parece ser un proyecto obsoleto, probablemente continuaré usando Python 2.7 con el mencionado "hack".

Saludos,

Respuesta

2

¿El módulo C generada ha definido una función PyInit__pytellapic?

El nombre y el perfil si el método init del módulo ha cambiado en Python 3. Si desea que se ejecute exactamente el mismo código C tanto en Python 2 como en Python 3, debe incluir tanto el nombre antiguo como el nuevo. Consulte el capítulo Migrating C Extensions para obtener más información.

Según SWIG's documentation SWIG 2.0 debería hacer esto si pasa el parámetro -py3, pero no lo he intentado.

+0

En lo que concierne al parámetro -py3, debo decir que lo he intentado sin éxito. También he probado otras banderas enumeradas en 'swig -python -help' sin suerte. En un par de minutos (tal vez horas) estoy leyendo esa extensión de C. Gracias por su guía y respuesta. – Sebastian

+0

Agrego otro comentario para evitar mezclar y hacer un lío con este. Respondiendo a su pregunta, hice un grep que resultó en: '# define SWIG_init PyInit__pytellapic' así que, sinceramente, no sé por qué me da ese error. – Sebastian

+0

@Sebastian: Publicar el código que genera SWIG podría ser útil, pero sospecho que debe solicitarlo en una lista de correo de SWIG. Parece * que estás haciendo lo correcto a juzgar por la documentación. –