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 :
- 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.
- 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.
-
El uso de objetos Python en Cython es posible, pero limitado, tan pronto como
cdef
algunas partes. Pruebe con "un" -cdefing el dict. -
El error que tiene sugiere que tiene una expresión que es
x[y]
dondex
es una tupla ey
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. - 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?