Wszystko śmiga. Funkcja zwraca wartość do pythona tak jak powinna. Jednak dzieje się tak tylko pod linuxem. Pod windowsem gdy chcę wyprintować wartość zwróconą przez funkcję otrzymuję nan.
Windows: 2.5 2.93251 nan
Linux: 2.5 2.93251 2.93251
Domyślam się, że problem leży w interpretacji danych zwróconych z cpp do pythona. Stwierdziłem, że może windows potrzebuje dllki zamiast so, ale w tym przypadku jest jeszcze gorzej.
D:\cpp>python test.py Traceback (most recent call last): File "test.py", line 19, in f = Foo() File "test.py", line 12, in _init self.obj = lib.Foonew() File "C:\Python27\lib\ctypes_init.py", line 375, in getattr func = self.getitem(name) File "C:\Python27\lib\ctypes_init_.py", line 380, in getitem func = self.FuncPtr((nameorordinal, self)) AttributeError: function 'Foo_new' not found
Czy mógłbym liczyć na jakieś porady, albo wskazanie tutoriala, który przerabialiście i takie myki działały? Przyznam, że z cpp jestem zielony i jeśli porady miałyby być jakieś mega pro to prosiłbym jednak o wytłumaczenie jak krowie na rowie ;)
@pshemeq: Pewnie masz wersje cPythona skompilowanego MSVC, a bibliotekę kompilujesz poprzez MinGW. A tak poza tym to lepiej używać CFFI dla pythona niż ctypes.
@cyanoone: tak, wszędzie 2.7 @filozof900: windows na windowsie, ale pod MinGW @lionbest: a CFFI nie znam, zapoznam się. Pythona mam standardowego, a biblioteka faktycznie MinGW.
@pshemeq: Standardowo chyba jest skompilowany poprzez MSVC, nie mam teraz jak sprawdzić, ale chyba raczej tak. A no to tak z buta to nie zadziała, ABI MinGW i MSVC różnią się i trzeba się jakoś bawić atrybutami, żeby to zadziałało. Ja w to nie wnikałem, więc dużo nie pomogę. Niby clang++ stara się być kompatybilny z MSVC, ale tak czy siak musisz go zainstalować żeby clang miał skąd brać biblioteki.
Czy ktoś z Was korzystał z pythonowej biblioteki ctypes?
Gdy pod linuksem wykonuje polecenia:
g++ -c -fPIC test.cpp -o test.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so test.o
Wszystko śmiga. Funkcja zwraca wartość do pythona tak jak powinna. Jednak dzieje się tak tylko pod linuxem. Pod windowsem gdy chcę wyprintować wartość zwróconą przez funkcję otrzymuję nan.
Windows:
2.5
2.93251
nan
Linux:
2.5
2.93251
2.93251
Domyślam się, że problem leży w interpretacji danych zwróconych z cpp do pythona. Stwierdziłem, że może windows potrzebuje dllki zamiast so, ale w tym przypadku jest jeszcze gorzej.
D:\cpp>python test.py
Traceback (most recent call last):
File "test.py", line 19, in
f = Foo()
File "test.py", line 12, in _init
self.obj = lib.Foonew()
File "C:\Python27\lib\ctypes_init.py", line 375, in getattr
func = self.getitem(name)
File "C:\Python27\lib\ctypes_init_.py", line 380, in getitem
func = self.FuncPtr((nameorordinal, self))
AttributeError: function 'Foo_new' not found
Program w pythonie (z loadem so):
https://pastebin.com/ZhkZf9d3
Program w pythonie (z dll):
https://pastebin.com/025J7Kat
Program w cpp:
https://pastebin.com/K7RSRNnD
Czy mógłbym liczyć na jakieś porady, albo wskazanie tutoriala, który przerabialiście i takie myki działały? Przyznam, że z cpp jestem zielony i jeśli porady miałyby być jakieś mega pro to prosiłbym jednak o wytłumaczenie jak krowie na rowie ;)
A tak poza tym to lepiej używać CFFI dla pythona niż ctypes.
@filozof900: windows na windowsie, ale pod MinGW
@lionbest: a CFFI nie znam, zapoznam się. Pythona mam standardowego, a biblioteka faktycznie MinGW.
A no to tak z buta to nie zadziała, ABI MinGW i MSVC różnią się i trzeba się jakoś bawić atrybutami, żeby to zadziałało. Ja w to nie wnikałem, więc dużo nie pomogę.
Niby clang++ stara się być kompatybilny z MSVC, ale tak czy siak musisz go zainstalować żeby clang miał skąd brać biblioteki.