ANN: pyfromc - Python from C++ and vice versa
Gerson Kurz
gerson.kurz at t-online.de
Sat Nov 1 00:48:55 EST 2003
Imagine the following situation:
- You have a existing C++ application. You want to migrate parts of it
to python. That is, you want to be able to call python code from C++
code.
- You also want to be able to call C++ code from python.
- Your C++ code is multithreaded and there is no guarantee that any
one thread calling python has initialized the interpreter.
- You need to distribute the resulting app with minimum overhead.
Enter pyfromc. It is a sample Win32 C++ application using an embedded
python interpreter, to be used as a potential starting point.
You can download pyfromc here:
http://p-nand-q.com/python/pyfromc-1.0.exe
Note that the installer is only 692.031 bytes large, but includes the
c++ sample app, the embedded python interpreter and the full
sourcecode.
License
There is none. Use at own risk.
*** Calling Python from C++ ***
pyfromc.py is a sample python code that exposes two global functions,
test and dumpmods. The C++ class Python inside pyfromc.cpp/.h defines
wrapper methods for these calls. E.g. if you want to add a new method
to pyfromc.py, you must also define a wrapper method in pyfromc.h and
implement it in pyfromc.cpp.
The C++ wrapper method uses the helper class PythonCall, which in turn
uses techniques described in the Python manual, section Embedding
Python in Another Application.
*** Calling C++ from Python ***
Basically, cfrompy.cpp is a standard python module, as described in
the python manual, section Extending Python with C or C++ . The only
difference is that cfrompy.cpp is not a DLL, it is part of the
executable code you write, so you have easier access to your existing
C++ code.
*** Thread safety ***
The code is (or rather: should be) threadsafe. That is, you should be
able to call python code from any native Win32 thread, without any
additional precautions (provided your C++ code is already threadsafe).
The code uses the techniques described in PEP 311 - Simplified Global
Interpreter Lock Acquisition for Extensions.
*** Distribution your app ***
Starting with python 2.3, you can distribute modules in a zipfile,
called "python23.zip", which must be in the same directory as
python23.dll. So, what you need is
- Your C++ app
- python23.dll
- all modules you need encoded in python23.zip
- all .pyd extensions you need (cannot be stored in python23.zip
because loaded as a DLL)
The only problem is: how to find out what modules you need. Well,
enter dumpmods.py, a small python script that enumerates all loaded
modules and dumps them into a target directory. Usage: When your
program ends, add these two lines:
import dumpmods
dumpmods.analyze_modules(path to store files in)
(Homepage for this code: http://p-nand-q.com/python/pyfromc.html)
where "path to store files in" has obvious connotations.
More information about the Python-list
mailing list