[Python] Cython ImportError: ./region.so: undefined symbol: G_get_window
Pietro
peter.zamb a gmail.com
Sab 10 Ago 2013 18:03:59 CEST
Ciao,
scusate se ritorno sull'argomento ma le mie ricerche web non mi hanno
aiutato ad identificare dove sia l'errore... Immagino che come l'altra
volta stia sbagliando qualcosa di stupido... vi riporto le parti
salienti del codice, la versione completa la potete trovare qui:
https://github.com/zarch/cygrass/tree/master/gis/region
Nel mio header ho definito la struct e le due funzioni che voglio utilizzare:
{{{
# file: "cgis.pxd"
cdef extern from "grass/gis.h":
cdef struct Cell_head:
int format
int compressed
int rows
int rows3
int cols
int cols3
int depths
int proj
int zone
double ew_res
double ew_res3
double ns_res
double ns_res3
double tb_res
double north
double south
double east
double west
double top
double bottom
void G_get_window(Cell_head *)
void G_get_set_window(Cell_head *)
}}}
Poi ho definito una classe, come segue:
{{{
# file: "region.pyx"
cimport cgis
cdef class Region:
cdef cgis.Cell_head c_region
def __cinit__(self, default=False):
if default:
self.get_default()
else:
self.get_current()
def get_current(self):
cgis.G_get_set_window(&self.c_region)
def get_default(self):
cgis.G_get_window(&self.c_region)
}}}
E il mio file setup.py contiene:
{{{
# file: "setup.py"
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import os
INCLUDE_DIR = os.path.join(os.getenv('GISBASE'), 'include')
setup(
cmdclass={'build_ext': build_ext},
ext_modules=[Extension("region", ["region.pyx"],
include_dirs=[INCLUDE_DIR, ],
),
]
)
}}}
la compilazione non dà errori ne warning... ma se provo ad importare
la classe ottengo:
{{{
In [1]: from region import Region
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-b863223cb34d> in <module>()
----> 1 from region import Region
ImportError: ./region.so: undefined symbol: G_get_window
}}}
qualcuno riesce a capire il perché?
Nel file gis.h è definita la struct "Cell_head" mentre le funzioni
sono a loro volta importate alla riga 577:
http://trac.osgeo.org/grass/browser/grass/trunk/include/gis.h#L577
dal seguente file:
http://trac.osgeo.org/grass/browser/grass/trunk/include/defs/gis.h#L292
Però in genere in C mi basta aggiungere l'include: #include
<grass/gis.h>, con cython devo fare qualcosa di diverso? idee?
Grazie per l'aiuto!
Pietro
Maggiori informazioni sulla lista
Python