×
Namespaces

Variants
Actions
Revision as of 09:26, 23 January 2012 by hamishwillee (Talk | contribs)

Archived:How to embed Python in Symbian C++

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata
Article
Created: cyke64 (12 Apr 2007)
Last edited: hamishwillee (23 Jan 2012)


It's pretty common to want to extend S60 Python by adding functionality available to the underlying S60 C++ APIs. You can extend Python with C++. But, you can also embed a Python interpreter inside !

Add the following code , which does a lot of setup, but calls the function foo in the module Bar.


 TInt retVal(KErrNone);
 
// Create a Python interpreter
CSPyInterpreter* it = CSPyInterpreter::NewInterpreterL();
CleanupStack::PushL(it);
 
// Save state of any current Python interpreter, and acquire the
// interpreter lock
PyEval_RestoreThread(PYTHON_TLS->thread_state);
 
char *module_name = "Bar" ;
char *foo = "foo" ;
char *response = NULL ;
 
TInt32 r_len = 0 ;
PyObject *pModule = PyImport_ImportModule(module_name) ;
 
if ( pModule != NULL )
{
PyObject *module_dict = PyModule_GetDict(pModule);
PyObject *expression = PyDict_GetItemString(module_dict, pre_handler);
PyObject *arglist = Py_BuildValue("(s#)", aString.Ptr(),aString.Length()) ;
 
PyObject *result = PyEval_CallObject(expression, arglist);
 
response = PyString_AsString( result ) ;
 
r_len = strlen( response ) ;
}
 
// Make a Symbian descriptor pointer to the char * response
TPtrC8 symResponse((TUint8*)response, r_len ) ;
 
// Clean-up, and restore thread state
 
PyEval_SaveThread();
CleanupStack::PopAndDestroy(it);


#
# module Bar.py
#
 
# function 'foo' in the module 'Bar'.
# A string value is passed to the Python function
# and a string value is returned
 
def foo(message):
return 'foo got message: ' + message

link : documentation Python Chapter 9.1 Extending and embedding

68 page views in the last 30 days.
×