python compiler-errors cython

python - Verificación de la compatibilidad en la compilación de tipos de extensión y su uso con cdef



compiler-errors cython (2)

Preguntas permanentes:

  • ¿Por qué otros errores en la compilación de Cython apuntan a la línea de error específica, mientras que esto no?

Antes de la actualización:

Debido a la dificultad en la compilación de tipos de extensión, como se menciona en el enlace ''no compilará'' a continuación, se pensó que AssertionError estaba relacionado con los tipos de extensión (después de que su instanciación se transfirió al archivo pyx principal).

Alguien de esta publicación del foro dijo que "si realmente desea tipos de extensión y desea declarar sus tipos en su código, debe declarar sus atributos C en un archivo .pxd".

Si eso es cierto en este caso, el problema es que los archivos pyx no se compilarán para mí cuando use archivos pxd. No hay ningún error al compilar el tipo de extensión en un archivo pyx, pero luego recibo el error extTypeName is not a type identifier cuando el tipo de extensión se usa después de su importación.

En los comentarios me dijeron que los tipos de extensión se pueden definir en el archivo pyx con la función principal que los usa. Al hacerlo, recibo un error que no sé cómo rastrear ( AssertionError: unexpected type int and base type tuple object for indexing ). El seguimiento completo se publica a continuación.

Difícil de rastrear el error

Rastreo al intentar compilar con los tipos de extensión declarados en el mismo archivo pyx (que no estoy seguro es la fuente del problema):

Traceback (most recent call last): File "setup.py", line 37, in <module> ext_modules = [Extension("HintToCRdict", ["HintToCRdict.pyx"])] File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py", line 151, in setup dist.run_commands() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 953, in run_commands self.run_command(cmd) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py", line 972, in run_command cmd_obj.run() File "/Library/Python/2.7/site-packages/Cython/Distutils/build_ext.py", line 164, in run _build_ext.build_ext.run(self) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/build_ext.py", line 337, in run self.build_extensions() File "/Library/Python/2.7/site-packages/Cython/Distutils/build_ext.py", line 171, in build_extensions ext.sources = self.cython_sources(ext.sources, ext) File "/Library/Python/2.7/site-packages/Cython/Distutils/build_ext.py", line 324, in cython_sources full_module_name=module_name) File "/Library/Python/2.7/site-packages/Cython/Compiler/Main.py", line 688, in compile return compile_single(source, options, full_module_name) File "/Library/Python/2.7/site-packages/Cython/Compiler/Main.py", line 638, in compile_single return run_pipeline(source, options, full_module_name) File "/Library/Python/2.7/site-packages/Cython/Compiler/Main.py", line 495, in run_pipeline err, enddata = Pipeline.run_pipeline(pipeline, source) File "/Library/Python/2.7/site-packages/Cython/Compiler/Pipeline.py", line 365, in run_pipeline data = phase(data) File "/Library/Python/2.7/site-packages/Cython/Compiler/Pipeline.py", line 53, in generate_pyx_code_stage module_node.process_implementation(options, result) File "/Library/Python/2.7/site-packages/Cython/Compiler/ModuleNode.py", line 131, in process_implementation self.generate_c_code(env, options, result) File "/Library/Python/2.7/site-packages/Cython/Compiler/ModuleNode.py", line 359, in generate_c_code self.body.generate_function_definitions(env, code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 435, in generate_function_definitions stat.generate_function_definitions(env, code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 1944, in generate_function_definitions self.generate_function_body(env, code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 1698, in generate_function_body self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 5851, in generate_execution_code if_clause.generate_execution_code(code, end_label, is_last=i == last) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 5894, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/UtilNodes.py", line 321, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 6402, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/UtilNodes.py", line 321, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 6402, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 5851, in generate_execution_code if_clause.generate_execution_code(code, end_label, is_last=i == last) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 5894, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/UtilNodes.py", line 89, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 6015, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 6192, in generate_execution_code self.body.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 441, in generate_execution_code stat.generate_execution_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 4786, in generate_execution_code self.generate_rhs_evaluation_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/Nodes.py", line 5073, in generate_rhs_evaluation_code self.rhs.generate_evaluation_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/ExprNodes.py", line 699, in generate_evaluation_code self.generate_subexpr_evaluation_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/ExprNodes.py", line 714, in generate_subexpr_evaluation_code node.generate_evaluation_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/ExprNodes.py", line 699, in generate_evaluation_code self.generate_subexpr_evaluation_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/ExprNodes.py", line 714, in generate_subexpr_evaluation_code node.generate_evaluation_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/ExprNodes.py", line 705, in generate_evaluation_code self.generate_result_code(code) File "/Library/Python/2.7/site-packages/Cython/Compiler/ExprNodes.py", line 3737, in generate_result_code self.type, self.base.type) AssertionError: unexpected type int and base type tuple object for indexing


Los tipos de extensión no fueron un problema en la compilación (al menos cuando se declararon dentro del mismo archivo pyx que la función cdef principal); El error está surgiendo en otra parte.

Resuelto :

  1. El AssertionError fue causado por un simple índice de acceso a esta tupla.

Donde una tupla fue declarada como:

cdef: tuple curIRs

... y establecer en bucles anidados como:

for deriv1 in xrange(len(L1)): for deriv2 in xrange(len(L2)): curIRs = (deriv2, deriv1)

... y se accede a los índices de tuplas:

d1[ix] = (curIRs[0], curIRs[1])

Fue un descuido aparentemente inocuo que curIRs no se almacenó simplemente en lugar de copiarlo esencialmente mediante acceso al índice. Sin embargo, aquí es donde ocurrió el error por una razón desconocida:

Cuando (curIRs [0], curIRs [1]) se reemplaza por curIRs, el AssertionError cesa.

  1. Como se indicó en los comentarios, la función principal en el archivo pyx no se puede definir con cdef, ya que se invoca en un script python.

La sugerencia de Pierre de Buyl en los comentarios fue muy útil: ''eliminar las declaraciones de cdef de posibles variables problemáticas hasta que se resuelva el error''. es decir, donde probablemente no haya ningún error en Python, se puede descubrir una incompatibilidad en Cython


Una respuesta con lo que puedo tomar de tu mensaje.

  1. El uso de objetos Python en Cython es posible, pero limitado, tan pronto como cdef algunas partes. Pruebe con "un" -cdefing el dict.
  2. El error que tiene sugiere que tiene una expresión que es x[y] donde x es una tupla e y un int. En principio debería funcionar bien (indexar una tupla con un int debería estar bien). Por lo tanto, puede ver los corchetes en el Cython para averiguar de dónde viene.
  3. Usted mencionó haber eliminado el archivo pxd. ¿Ha movido la declaración completa de la clase de extensión / otras definiciones de tipo al archivo pyx?