From 360477dcc304b8a18c467e59435d8c766bbb76bb Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 15 Jul 2009 14:14:44 +0200 Subject: python/python-apt.h: Introduce the C++ API The C++ API provides support for creating Python objects from C++ objects given by pointer or reference (depending on the implementation of the Python object) and for retrieving the underlying C++ object from the Python object and for checking the type of the Python object. --- doc/client-example.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 doc/client-example.cc (limited to 'doc/client-example.cc') diff --git a/doc/client-example.cc b/doc/client-example.cc new file mode 100644 index 00000000..7fa6672f --- /dev/null +++ b/doc/client-example.cc @@ -0,0 +1,46 @@ +/* + * client-example.cc - A simple example for using the python-apt C++ API. + * + * Copyright 2009 Julian Andres Klode + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ +#include + +int main(int argc, char *argv[]) { + Py_Initialize(); + if (import_apt_pkg() < 0) + return 1; + + // Initialize a module. + PyObject *Module = Py_InitModule("client", NULL); + + // Create a HashString, which will be added to the module. + HashString *hash = new HashString("0966a120bb936bdc6fdeac445707aa6b"); + // Create a Python object for the hashstring and add it to the module + PyModule_AddObject(Module, "hash", PyHashString_FromCpp(hash)); + + // Another example: Add the HashString type to the module. + Py_INCREF(&PyHashString_Type); + PyModule_AddObject(Module, "HashString", (PyObject*)(&PyHashString_Type)); + + // Run IPython, adding the client module to the namespace. + PySys_SetArgv(argc, argv); + PyRun_SimpleString("from IPython.Shell import start\n"); + PyRun_SimpleString("import client\n"); + PyRun_SimpleString("start(user_ns=dict(client=client)).mainloop()\n"); + Py_Finalize(); +} -- cgit v1.2.3 From 6975079da04ae1fad51dca63b40a1aae15f45aa0 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Wed, 15 Jul 2009 20:39:18 +0200 Subject: doc/client-example.cc: Make it a module AND an application. You can now compile this as a module or as an application. The benefit is that the explained process is more like the one required for Python 3. --- doc/client-example.cc | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'doc/client-example.cc') diff --git a/doc/client-example.cc b/doc/client-example.cc index 7fa6672f..7f01b637 100644 --- a/doc/client-example.cc +++ b/doc/client-example.cc @@ -18,13 +18,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ + #include +#include -int main(int argc, char *argv[]) { - Py_Initialize(); +// The module initialization. +extern "C" void initclient() { if (import_apt_pkg() < 0) - return 1; - + return; // Initialize a module. PyObject *Module = Py_InitModule("client", NULL); @@ -36,11 +37,32 @@ int main(int argc, char *argv[]) { // Another example: Add the HashString type to the module. Py_INCREF(&PyHashString_Type); PyModule_AddObject(Module, "HashString", (PyObject*)(&PyHashString_Type)); +} - // Run IPython, adding the client module to the namespace. +int main(int argc, char *argv[]) { + // Return value. + int ret = 0; + // Initialize python + Py_Initialize(); + // Make the client module importable + PyImport_AppendInittab("client", &initclient); + // Set the commandline arguments. PySys_SetArgv(argc, argv); - PyRun_SimpleString("from IPython.Shell import start\n"); - PyRun_SimpleString("import client\n"); - PyRun_SimpleString("start(user_ns=dict(client=client)).mainloop()\n"); + + // Import the module, so the user does not have to import it. + if (PyRun_SimpleString("import client\n") < 0) { + // Failure (should never be reached) + ret = 1; + goto end; + } + + // Run IPython if available, otherwise a normal interpreter. + if (PyRun_SimpleString("from IPython.Shell import start\n") == 0) + PyRun_SimpleString("start(user_ns=dict(client=client)).mainloop()\n"); + else + Py_Main(argc, argv); + +end: Py_Finalize(); + return ret; } -- cgit v1.2.3 From 8d311d4829312718fcb6ab3d0385f8fa7f5cf3e1 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 2 Feb 2010 17:30:49 +0100 Subject: doc/client-example.cc: Update against the new API. --- debian/changelog | 1 + doc/client-example.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'doc/client-example.cc') diff --git a/debian/changelog b/debian/changelog index 51472a0c..fd87a576 100644 --- a/debian/changelog +++ b/debian/changelog @@ -24,6 +24,7 @@ python-apt (0.7.93.1) UNRELEASED; urgency=low - Handle the case where ararchive_new returns NULL in debfile_new. * apt/progress/base.py: - select.error objects do not have an errno attribute (Closes: #568005) + * doc/client-example.cc: Update against the new API. -- Julian Andres Klode Sat, 23 Jan 2010 15:35:55 +0100 diff --git a/doc/client-example.cc b/doc/client-example.cc index 7f01b637..73fa3eed 100644 --- a/doc/client-example.cc +++ b/doc/client-example.cc @@ -32,7 +32,7 @@ extern "C" void initclient() { // Create a HashString, which will be added to the module. HashString *hash = new HashString("0966a120bb936bdc6fdeac445707aa6b"); // Create a Python object for the hashstring and add it to the module - PyModule_AddObject(Module, "hash", PyHashString_FromCpp(hash)); + PyModule_AddObject(Module, "hash", PyHashString_FromCpp(hash, false, NULL)); // Another example: Add the HashString type to the module. Py_INCREF(&PyHashString_Type); -- cgit v1.2.3