blob: 00c5a0e66e022da742bbc961e53de6d49e7eb94e [file] [log] [blame]
Guido van Rossum705d5171994-10-08 19:30:50 +00001/* Example of embedding Python in another program */
2
Guido van Rossum3caad8c1995-03-28 09:22:53 +00003#include "Python.h"
Guido van Rossum705d5171994-10-08 19:30:50 +00004
Thomas Wouters78890102000-07-22 19:25:51 +00005void initxyzzy(void); /* Forward */
Guido van Rossum81e84c91997-12-25 04:51:41 +00006
Thomas Wouters78890102000-07-22 19:25:51 +00007main(int argc, char **argv)
Guido van Rossum705d5171994-10-08 19:30:50 +00008{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00009 /* Pass argv[0] to the Python interpreter */
10 Py_SetProgramName(argv[0]);
Guido van Rossum705d5171994-10-08 19:30:50 +000011
Antoine Pitrouc83ea132010-05-09 14:46:46 +000012 /* Initialize the Python interpreter. Required. */
13 Py_Initialize();
Guido van Rossum705d5171994-10-08 19:30:50 +000014
Antoine Pitrouc83ea132010-05-09 14:46:46 +000015 /* Add a static module */
16 initxyzzy();
Guido van Rossum81e84c91997-12-25 04:51:41 +000017
Antoine Pitrouc83ea132010-05-09 14:46:46 +000018 /* Define sys.argv. It is up to the application if you
Andrew M. Kuchlingde0aeaa2010-06-11 00:16:08 +000019 want this; you can also leave it undefined (since the Python
Antoine Pitrouc83ea132010-05-09 14:46:46 +000020 code is generally not a main program it has no business
Andrew M. Kuchlingde0aeaa2010-06-11 00:16:08 +000021 touching sys.argv...)
22
23 If the third argument is true, sys.path is modified to include
24 either the directory containing the script named by argv[0], or
25 the current working directory. This can be risky; if you run
26 an application embedding Python in a directory controlled by
27 someone else, attackers could put a Trojan-horse module in the
28 directory (say, a file named os.py) that your application would
29 then import and run.
30 */
31 PySys_SetArgvEx(argc, argv, 0);
Guido van Rossum705d5171994-10-08 19:30:50 +000032
Antoine Pitrouc83ea132010-05-09 14:46:46 +000033 /* Do some application specific code */
34 printf("Hello, brave new world\n\n");
Guido van Rossum705d5171994-10-08 19:30:50 +000035
Antoine Pitrouc83ea132010-05-09 14:46:46 +000036 /* Execute some Python statements (in module __main__) */
37 PyRun_SimpleString("import sys\n");
38 PyRun_SimpleString("print sys.builtin_module_names\n");
39 PyRun_SimpleString("print sys.modules.keys()\n");
40 PyRun_SimpleString("print sys.executable\n");
41 PyRun_SimpleString("print sys.argv\n");
Guido van Rossum705d5171994-10-08 19:30:50 +000042
Antoine Pitrouc83ea132010-05-09 14:46:46 +000043 /* Note that you can call any public function of the Python
44 interpreter here, e.g. call_object(). */
Guido van Rossum705d5171994-10-08 19:30:50 +000045
Antoine Pitrouc83ea132010-05-09 14:46:46 +000046 /* Some more application specific code */
47 printf("\nGoodbye, cruel world\n");
Guido van Rossum705d5171994-10-08 19:30:50 +000048
Antoine Pitrouc83ea132010-05-09 14:46:46 +000049 /* Exit, cleaning up the interpreter */
50 Py_Exit(0);
51 /*NOTREACHED*/
Guido van Rossum705d5171994-10-08 19:30:50 +000052}
53
Guido van Rossum81e84c91997-12-25 04:51:41 +000054/* A static module */
55
Thomas Wouters78890102000-07-22 19:25:51 +000056/* 'self' is not used */
Guido van Rossum81e84c91997-12-25 04:51:41 +000057static PyObject *
Guido van Rossum7339f4c2001-01-10 17:09:00 +000058xyzzy_foo(PyObject *self, PyObject* args)
Guido van Rossum81e84c91997-12-25 04:51:41 +000059{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 return PyInt_FromLong(42L);
Guido van Rossum81e84c91997-12-25 04:51:41 +000061}
62
63static PyMethodDef xyzzy_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000064 {"foo", xyzzy_foo, METH_NOARGS,
65 "Return the meaning of everything."},
66 {NULL, NULL} /* sentinel */
Guido van Rossum81e84c91997-12-25 04:51:41 +000067};
68
69void
Thomas Wouters78890102000-07-22 19:25:51 +000070initxyzzy(void)
Guido van Rossum81e84c91997-12-25 04:51:41 +000071{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000072 PyImport_AddModule("xyzzy");
73 Py_InitModule("xyzzy", xyzzy_methods);
Guido van Rossum81e84c91997-12-25 04:51:41 +000074}