pythonból c funkció hogyan

Fórumok

Igazából kész gcc programhoz kell utólag GUI-t csinálnom, ami Linuxon és Windowson is fut, így a Python-Tkinter párost választottam.
Hogyan lehet Pythonból meghívni a c-ben létező
int myvar=myfunction(param1, param2)
funkciót?
Nem igazából ismerem a Pythont, így szájbarágósan, please....

Hozzászólások

Google? Annyi helyen megírták már...

Próbálok ez alapján elindulni, de a kapott hibaüzenetekre adott Google-válaszok nem segítenek.
Olyanra figyelmeztetnek, ami nálam rendben van.

python-dev telepítve, forrásban #include Python.h ott van (kacsacsőrők között)
fordítónak átadva így: gcc -g try.c -I/usr/include/python2.7 -o try

Az oldalról copy/paste átvett mintapélda:
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;

if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return Py_BuildValue("i", sts);
}

Hibaüzenet:
/tmp/cch3PNqm.o: In function `spam_system':
/home/steve/projects/c/try/try.c:965: undefined reference to `PyArg_ParseTuple'
/home/steve/projects/c/try/try.c:968: undefined reference to `Py_BuildValue'
collect2: error: ld returned 1 exit status

No offense, de ha C-ben akarsz programozni, akkor meg kell azt tanulni, és nem 10 meg 100 kérdés-válasz formájában.

Hogy mégis segítsek ebben a konkrét esetben, a linkeléshez -l/-L paraméterek is kellenek. Hogy mi az a linkelés, az már egy szép nagy témakör.

--

En ezt ugy csinaltam, hogy a C forrastbol shared object-et / dll-t csinaltam, majd azokat hivtam a Python-bol a cdll.LoadLibrary() fuggvennyel, valahogy igy:


		...
		# Load it8512.dll
		self.device = cdll.LoadLibrary("it8512.dll")

		# Make prototype: int IT8512Init(char *serialPort, int address);
		self.DeviceInit = self.device.IT8512Init
		self.DeviceInit.argtypes = [c_char_p, c_int]
		self.DeviceInit.restype = c_int

		# Make prototype: int IT8512Close(void);
		self.DeviceClose = self.device.IT8512Close
		self.DeviceClose.argtypes = None
		self.DeviceClose.restype = c_int

		# Make prototype: int IT8512SetRemoteControlMode(int remoteMode);
		self.DeviceSetRemoteControlMode = self.device.IT8512SetRemoteControlMode
		self.DeviceSetRemoteControlMode.argtypes = [c_int]
		self.DeviceSetRemoteControlMode.restype = c_int

		# Make prototype: int IT8512SetInputState(int inputState);
		self.DeviceSetInputState = self.device.IT8512SetInputState
		self.DeviceSetInputState.argtypes = [c_int]
		self.DeviceSetInputState.restype = c_int
		...

Python-bol le tudod kerdezni az OS-t is, es eldontheted, hogy a .dll-t vagy a .so-t toltod-e be, attol fuggoen, hogy Windows vagy Linux.

/sza2

Hogy egyszerűsítsem a kérdést, kiirtottam a parancsból minden feleslegeset (flex, bison, usb linkelése), hogy csak a lényegre lehessen koncentrálni. Így aztán szépen átsiklottam, hiába volt a linkelére figyelmeztetés, én a parancssori include meglétére asszociáltam. Sorry, ezt szépen benéztem.