33

I'm experimenting with python functions right now. I've found a way to import python functions into c/c++ code, but not the other way around.

I have a c++ program written and it has a certain function in it. I'd like to "import" the compiled c++ program into my python script and call the c++ function.

For simplicity, say the c++ function is as simple as:

int square(x)
{
  return x*x;
}

and the compiled program is named Cprog.

I'd like my python script to be something like:

import Cprog

print Cprog.square(4)

Is this possible? I've searched the internet to no avail and I'm hoping one of you gurus might have a clever way of going about this...

3
  • 2
    Have you tried Boost::Python? Commented Nov 22, 2010 at 1:02
  • No I haven't. But it looks like it might do what I want. I'm looking into it at the moment. Thanks a lot! Would anybody know of a less complicated way of doing this though (without the use of a third-wheel module)? Commented Nov 22, 2010 at 1:12
  • Possible duplicate of Calling C/C++ from Python? Commented Apr 25, 2019 at 11:44

5 Answers 5

30

Here is a little working completion of the simple example above. Although the thread is old, I think it is helpful to have a simple all-embracing guide for beginners, because I also had some problems before.

function.cpp content (extern "C" used so that ctypes module can handle the function):

extern "C" int square(int x)
{
  return x*x;
}

wrapper.py content:

import ctypes
print(ctypes.windll.library.square(4)) # windows
print(ctypes.CDLL('./library.so').square(4)) # linux or when mingw used on windows

Then compile the function.cpp file (by using mingw for example):

g++ -shared -c -fPIC function.cpp -o function.o

Then create the shared object library with the following command (note: not everywhere are blanks):

g++ -shared -Wl,-soname,library.so -o library.so function.o

Then run the wrapper.py an the program should work.

Sign up to request clarification or add additional context in comments.

2 Comments

Tried this and got (WindowsError(126, 'The specified module could not be found'), <type 'exceptions.WindowsError'>) for the first one and ; (WindowsError(193, '%1 is not a valid Win32 application'), <type 'exceptions.WindowsError'>) for the second one. Any help?
@azazelspeaks Did you use regsvr32.exe to register that library?
11

If you build your program as a shared library/DLL, you could use ctypes to call it.

import ctypes
print ctypes.windll.cprog.square(4) # windows
print ctypes.CDLL('cprog.so').square(4) # linux

3 Comments

I forgot about ctypes, definately the way to go if its just a couple of functions you want exposed.
What's the best way to create a *.so file? Sorry, I'm not a computer programmer/scientist, and my g++ command is usually along the lines of "g++ Ccode.cpp -o Cfile". I've tried using -shared as an additional option along with the linux line suggested above and I received an error. I don't think I've created my *.so file correctly...any advice?
@Nick: That's a different question, one that has already been asked: stackoverflow.com/questions/3588476/…
5

You need to create a python module with that function in it. There are three main ways:

  1. Using Swig - this reads your c code and creates a python module from it.
  2. Hand coded using the python c api.
  3. Using Boost::Python (often the easiest way).

This pdf covers 1 and 2. This page will tell you how to use Boost::Python.

You cannot (easily) use a function that is in a c/c++ program - it must be in a static library (which you can also link your c/c++ program against).

EDIT - Cython Is also worth a mention.

Comments

4

You want to extend python with a C/C++ module. The following Python documentation is a good place to start reading: http://docs.python.org/extending/extending.html

Comments

0

There are a lot of different ways to wrap C++ code to be used in Python. Most are listed on the Python wiki here.

I've found a decently easy way to automate it is to use py++ to automatically generate the wrappers, then compile the generated files. But this is more appropriate for larger projects where wrapping everything by hand is just not very feasible and would cause a maintenence nightmare.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.