473,396 Members | 1,924 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

Re: embedding and extending python C API registering callback handlerobjects


--- On Fri, 6/27/08, Tim Spens <t_*****@yahoo.comwrote:
From: Tim Spens <t_*****@yahoo.com>
Subject: Re: embedding and extending python C API registering callback handler objects
To: py*********@python.org, "Matimus" <mc******@gmail.com>
Date: Friday, June 27, 2008, 9:16 AM
thanks, but didn't fix the problem.
--- On Fri, 6/27/08, Matimus <mc******@gmail.com>
wrote:
From: Matimus <mc******@gmail.com>
Subject: Re: embedding and extending python C API
registering callback handler objects
To: py*********@python.org
Date: Friday, June 27, 2008, 9:03 AM
On Jun 27, 8:22 am, Tim Spens
<t_sp...@yahoo.com>
wrote:
Hello all,
>
I've been trying to get an example found
herehttp://codeidol.com/python/python3/Embedding-Python/Registering-Callb...
to work. Every thing works fine except when I
try to
trigger an event from c that will call a python
function.
Here is my test code:
>
//-----------------------python
code--------------------------//
#! /usr/bin/env python
import time
import callback
>
def callback1(label,count):
print 'callback1 successfully
triggered from python via callback.so'
return 'callback1 =%s number
%i' % (label, count)
>
def callback2(label,count):
return 'callback2 =' +
label * count
>
print '\nTest1:'
callback.setHandler(callback1)
callback.triggerEvent() # simulate events
caught by C layer
>
print '\nTest2:'
callback.setHandler(callback2)
>
print 'Waiting for callback2 to be called
from
c:'
while 1:
time.sleep(.001)
>
//-----------------------c
code-------------------------------//
#include <Python.h>
#include <stdlib.h>
>
/* keep Python object in C */
static PyObject *Handler = NULL;
>
void Route_Event(char *label, int count){
char *cres;
PyObject *args, *pres;
/* call Python handler */
args = Py_BuildValue("(si)", label,
count);
pres = PyEval_CallObject(Handler, args);
Py_DECREF(args);
if (pres != NULL){
/* use and decref handler result */
PyArg_Parse(pres, "s",
&cres);
printf("%s\n", cres);
Py_DECREF(pres);
>
}}
>
// the actual python callback call
static PyObject *
make_call(PyObject *function, PyObject *args){
if (function == NULL) return NULL;
PyObject * val =
PyObject_CallObject(function,
args);
Py_XDECREF(args);
return val;
>
}
>
static PyObject *
Register_Handler(PyObject *self, PyObject *args){
/* save Python callable object */
Py_XDECREF(Handler);
PyArg_Parse(args, "O",
&Handler);
Py_XINCREF(Handler);
Py_INCREF(Py_None);
return Py_None;
>
}
>
static PyObject *
Trigger_Event(PyObject *self, PyObject *args){
/* let Python simulate event caught by C */
static int count = 0;
Route_Event("spam", count++);
Py_INCREF(Py_None);
return Py_None;
>
}
>
static struct PyMethodDef callback_methods[] = {
{"setHandler",
Register_Handler},
/* name, address */
{"triggerEvent", Trigger_Event},
{NULL, NULL}};
>
>
/* on first "import callback" */
void initcallback(){ /* this
is called by Python */
(void) Py_InitModule("callback",
callback_methods);
>
}
>
int main(){
while (1){
printf("1\n");
//attempting to call callback2
which is registered to Handler
//i've also tried args =
Py_BuildValue("(si)", label, count); here
but I
get a segfault.
PyObject *args =
Py_BuildValue("s","c code");
printf("2\n");
PyObject* val =
make_call(Handler,args);
printf("3\n");
Py_XDECREF (val);
printf("4\n");
sleep(1);
>
}}
>
//------------------------compiler
stuff----------------------//
gcc callback.c -c -g -Wall -fpic -I
/usr/include/python2.5 -o callback.o
gcc callback.c -g -Wall -I /usr/include/python2.5
-L
/usr/local/lib -lpython2.5 -o callback
gcc -shared -Wall callback.o -o callback.so
>
//------------------------test code
results-------------------//
../callback.py
Test1:
callback1 successfully triggered from python via
callback.so
callback1 =spam number 0
>
Test2:
Waiting for callback2 to be called from c:
#NOTHING EVER GETS PRINTED HERE CALLBACK NEVER
GETS
CALLED?
>
../callback
1
2
3
4
....
>
Thanks,
Tim
Maybe you just need to flush the stdout buffer in
python.
`sys.stdout.flush()`

Matt
--
http://mail.python.org/mailman/listinfo/python-list


--
http://mail.python.org/mailman/listinfo/python-list
I think I know where the problem is but I'm unsure how to fix it. When I call Register_Handler(...) from python via callback.setHandler1(callback1) this only seems to affect pythons ability to trigger an "event" in c. PyObject *Handler is always NULL even after I call Register_Handler(...). I thought there was some magic here that was assigning the pointer *Handler to my python callback1 handler so it could be triggered from c?

-Tim


Jun 27 '08 #1
0 2080

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: jordi | last post by:
Hi, I'm starting to use Python embedded in a C program. I'm using Python to execute several scripts using as a variables information retrieved for several multithread "agents" written in C. ...
4
by: Alicia Haumann | last post by:
I accidentally sent this to webmaster@python.org, so this could be a duplicate if "webmaster" forwards it to this list. :{ Hi, there. Thanks for any help that can be offered. I've been...
2
by: Roose | last post by:
With some googling I have found these resources: http://docs.python.org/ext/win-dlls.html http://www.python.org/doc/faq/windows.html I have a large Win32/MFC/C/C++ application that has an...
1
by: Tommy Nordgren | last post by:
I want to write an application that embeds and extends (at least) the Python and Perl interpreters. Now i want to find as much as possible about the Python tools used for extending and embedding...
3
by: Marco Meoni | last post by:
Hi all! I've a problem with a C++ class that has to be included in a python application. One way to do it is Extending and Embedding the Python Interpreter Now i have 2 questions 1) Is there a...
1
by: jeremito | last post by:
I am trying to learn how to extend and/or embed Python. I have looked at the document "Extending and Embedding the Python Interpreter" and also "Python/C API Reference Manual. In the examples...
6
by: Qun Cao | last post by:
Hi Everyone, I am a beginner on cross language development. My problem at hand is to build a python interface for a C++ application built on top of a 3D game engine. The purpose of this python...
3
by: anonymisiert85 | last post by:
At the moment i can run python-string-code from C (MinGW, WinXP) But how can i register a C-function in python-RUNTIME and call this C function from python - without wrapper dll's or libs??? ...
1
by: Thomas Troeger | last post by:
Dear all, I've successfully embedded the Python interpreter into a set of C/C++ application programs that use a larger library project with information from http://docs.python.org/api/api.html...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.