Kezdőoldal » Számítástechnika » Programozás » Hogyan lehetséges "normálisan"...

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ő?

Figyelt kérdés

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:

[link]


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


2018. okt. 21. 22:18
 1/2 anonim ***** válasza:

Normális, kétirányú átjárhatóság a thrifttel

[link]

2018. okt. 23. 17:39
Hasznos számodra ez a válasz?
 2/2 A kérdező kommentje:

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.

2018. okt. 24. 00:13

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!