Hogyan lehetséges "normálisan" átjárást képezni c++ és python között python típusok kezelésében (ubuntu alól)? Ha valaki c és python között tud átjárást akkor az is jöhet. Van itt Python hozzáértő?
Sikerült c++ alól elérnem ugyan, de igazából nem így kéne elérni.
Lekértem az objektum id-jét majd ezt átadtam a c++-nak unsigned long-ként amit átkasztoltam PyObject* típussá.
A cppyy modulton múlik, hogy nem képes kezelni a Python.h header-t. Vagyis c++ alól hiába is hoznék létre python objektumokat azt nem tudná fogadni a python e miatt a fogyatékosság miatt.
Példa kód:
aaalib.cpp pastebin com/CghnbCbx
aaalib.h tartalma : char* typeName(unsigned long id);
aaalib.py pastebin com/165e9b5d
A g++ -al az alábbi paraméterekkel fordítottam le a c++ kódot:
g++ -c -fPIC -I/usr/include/python2.7 aaalib.cpp -lpython2.7 -o aaalib.o
g++ -shared -Wl,-soname,aaalib.so -o aaaalib.so aaalib.o
Példa a működésre:
Mihelyt a header fájlomba beírom hogy #include <Python.h> onnastól kezdve nem képes működni a cppyy modul alól a python oldaláról (c++ oldalról teljesen rendbe van), viszont ugye mint tudjuk ez kellene a normális átjáráshoz.
Hiba üzenet ekkor:
In file included from input_line_18:1:
./aaalib.h:1:10: fatal error: 'Python.h' file not found
#include <Python.h>
^~~~~~~~~~
Traceback (most recent call last):
File "aaalib.py", line 4, in <module>
from cppyy.gbl import typeName as _typeName
ImportError: cannot import name typeName
Olvastam olyat hogy definiáljam az alábbi változót a parancsértelmezőbe így:
export CPLUS_INCLUDE_PATH=/usr/include/python2.7
Ekkor meg ez a hibaüzenet:
In file included from input_line_18:1:
In file included from ./aaalib.h:1:
In file included from /usr/include/python2.7/Python.h:61:
In file included from /usr/include/python2.7/pyport.h:332:
In file included from /usr/include/x86_64-linux-gnu/sys/time.h:25:
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:8:8: error: redefinition of 'timeval'
struct timeval
^
/home/user/.local/lib/python2.7/site-packages/cppyy_backend/etc/../etc/cling/lib/clang/5.0.0/include/bits/time.h:69:8: note: previous definition is here
struct timeval
^
Traceback (most recent call last):
File "aaalib.py", line 4, in <module>
from cppyy.gbl import typeName as _typeName
ImportError: cannot import name typeName
Normális, kétirányú átjárhatóság a thrifttel
Köszönöm a válaszod.
Úgy látom, hogy hálózati kapcsolattal oldja meg és nem használja a Python típusokat c++ alól hanem helyette szerializál/deszerializál.
Nem rossz cuccnak néz ki, magától adódik benne a több számítógépes adatfeldolgozás. Én egy számítógépes feldolgozáson dolgozok. Az amit linkeltél ágyúval verébre lövésnek érzem. A c++ a sebességkritikus rész miatt kell, a gyors mátrixműveletekez ami elég egyedi ahhoz hogy nincs benne a numpy modulba úgy hogy csak meghívjam a megfelő függvényt. Ciklusokkal Python-ba meg nem elég gyors. Azért nem így írtam ki a kérdést, hogy milyen python modulbeli típust használok c++ -ban mert a dolog általánosságba érdekel. Ez a megoldás annyiban tetszik jobban mint amit írtál, hogy kevesebb az overhead, mindenféle transzkódolás meg hálózatkezelés nélkül ötvözve van a Python rugalmassága a c++ natív kódjával.
Valahogy csak meg lehet csinálni pedig amire gondolok, hiszen a numpy modul megfelelő része c-ben van írva.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!