Convert Python program to C/C++ code?
Yes. Look at Cython. It does just that: Converts Python to C for speedups.
Example program of Cython as Python to C Converter
Far from a c expert but for me using ubuntu, the following works:
main.c:
#include "foo_api.h"
#include <stdio.h>
int main(int argc, char *argv[]) {
Py_Initialize();
initfoo();
import_foo();
double arr[5] = {1,2,3,4,5};
int i = 0;
foo(arr);
for(i = 0; i < 5; i++)
{
printf("%f\n", arr[i]);
}
Py_Finalize();
return 0;
}
foo.pyx:
cdef public api foo(double* x):
x[0] = 0.0
From the same directory:
$ cython foo.pyx
Then:
$ cc -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -o foo *.c -lpython2.7
Then just run.
$ ./foo
0.000000
2.000000
3.000000
4.000000
5.000000
I used pkg-config --cflags python
to get the flags:
$ pkg-config --cflags python
-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7
Without calling Py_Initialize (Initialize the Python interpreter. In an application embedding Python, this should be called before using any other Python/C API functions;), you will get:
Fatal Python error: PyThreadState_Get: no current thread
Aborted (core dumped)
Without initfoo()
or import_foo()
you get a:
Segmentation fault (core dumped)
If you don't call Py_Finalize:
Py_Initialize
a no-op when called for a second time (without calling Py_Finalize() first).
To get the delorean example from the docs to run:
main.py:
#include "delorean_api.h"
#include <stdio.h>
Vehicle car;
int main(int argc, char *argv[]) {
Py_Initialize();
initdelorean();
import_delorean();
car.speed = atoi(argv[1]);
car.power = atof(argv[2]);
activate(&car);
Py_Finalize();
return 0;
}
delorean.pyx:
ctypedef public struct Vehicle:
int speed
float power
cdef api void activate(Vehicle *v):
if v.speed >= 88 and v.power >= 1.21:
print "Time travel achieved"
else:
print("Sorry Marty")
The procedure is the same, the only change was I had to use ctypedef
with the Vehicle struct or else in main or use I had t use struct Vehicle car;
in main:
$ cython delorean.pyx
$ cc -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -o delorean *.c -lpython2.7
$ ./delorean 1 1
Sorry Marty
$ ./delorean 100 2
Time travel achieved
You can also get it to work without using Py_Initialize
etc...
In foo.pyx
you just need to make the function public:
cdef public foo(double* x):
x[0] = 0.0
I added #include <python2.7/Python.h>
just imported foo.h
in main.c and removed Py_Initialize();
etc. Just importing python.h
would not work for me but that may not be the case for everyone.
#include <python2.7/Python.h>
#include "foo.h"
#include <stdio.h>
int main(int argc, char *argv[]) {
double arr[5] = {1,2,3,4,5};
int i = 0;
foo(arr);
for(i = 0; i < 5; i++)
{
printf("%f\n", arr[i]);
}
return 0;
}
Compiling was the same:
$ cython foo.pyx
$ cc -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7 -o foo *.c -lpython2.7
$ ./foo
0.000000
2.000000
3.000000
4.000000
5.000000
If you are using the api version then just include the api header or vice versa as per the docs However, note that you should include either modulename.h or modulename_api.h in a given C file, not both, otherwise you may get conflicting dual definitions.
To do the same with the delorean example I had to use libc.stdio
to print the strings to avoid a segmentation fault:
from libc.stdio cimport printf
ctypedef public struct Vehicle:
int speed
float power
cdef public void activate(Vehicle *v):
if v.speed >= 88 and v.power >= 1.21:
printf("Time travel achieved\n")
else:
printf("Sorry Marty\n")
main:
#include <python2.7/Python.h>
#include <stdio.h>
#include "delorean.h"
Vehicle car;
int main(int argc, char *argv[]) {
car.speed = atoi(argv[1]);
car.power = atof(argv[2]);
activate(&car);
return 0;
}
It might make more sense to return the values:
ctypedef public struct Vehicle:
int speed
float power
cdef public char* activate(Vehicle *v):
if v.speed >= 88 and v.power >= 1.21:
return "Time travel achieved"
return "Sorry Marty"
main:
#include <python2.7/Python.h>
#include <stdio.h>
#include "delorean.h"
Vehicle car;
int main(int argc, char *argv[]) {
car.speed = atoi(argv[1]);
car.power = atof(argv[2]);
printf("%s\n",activate(&car));
return 0;
}
Use Cython as Python to C Converter
- Yes, at its core this is what Cython does. But ...
- You don't need Cython, however, you do need
libpython
. You may feel like it doesn't use that many Python features, but I think if you try this you'll find it's not true -- you won't be able to separate your program from its dependence onlibpython
while still using the Python language.
Another option is PyPy, specifically it's translation toolchain, NOT the PyPy Python interpreter. It lets you translate RPython, a subset of the Python language, into C. If you really aren't using many Python language features or libraries, this may work.
PyPy is mostly known as an alternative Python implementation, but it is also a set of tools for compiling dynamic languages into various forms. This is what allows the PyPy implementation of Python, written in (R)Python, to be compiled to machine code.
If C++ is available, Nuitka is a Python to C++ compiler that works for regular Python, not just RPython (which is what shedskin and PyPy use).
How can I convert Python3 code to C++/Assembly language?
Here is a Stackoverflow thread that asks a similar questions (at least how to get Python to C) and has a few links to different projects that should do just that: Writing code translator from Python to C?
Also here is another project called PyPy that seems to be a replacement and faster version of CPython mentioned in the thread linked above: https://www.pypy.org/index.html
Hopefully one of these can help you out with what you're trying to do. In general though, if you need something compiled to Assembly Code you would be best off to just write it in C. The problem with Python is that it compiles to bytecode which is then ran by an interpreter. So at no point is it assembly. C however is compiled directly to assembly so it would give you exactly what you want. By trying to go from Python to assembly you're just adding an extra middle man (which is one of these projects I've linked) that has a potential to mess up, have a bug, etc. All that being said, hopefully one of these options is able to work out for you and get the jobs done! Have a great one and good luck!
How to convert python code into a simple c haeder?
CPython
is just an implementation of Python in the C programming language. If you want to incorporate C code, you can write extension modules documented here.
Check out this StackOverflow post as well.
Alternatively, write a C program, compile it, and then call it via the subprocess module documented here.
Related Topics
Is It Safe to Delete a Null Pointer
Can You Remove Elements from a Std::List While Iterating Through It
Why Should the "Pimpl" Idiom Be Used
To_String Is Not a Member of Std, Says G++ (Mingw)
How to Determine If a String Is a Number With C++
C++11 Return Value Optimization or Move
How to Use a Binary Literal in C or C++
How to Add Additional Libraries to Visual Studio Project
Floating Point Division VS Floating Point Multiplication
Recommended Way to Initialize Srand
What Happens If I Assign a Negative Value to an Unsigned Variable
How to Specify a Pointer to an Overloaded Function
What Is the Purpose of the Most Vexing Parse
Function Parameter Evaluation Order
Variable Length Array (Vla) in C++ Compilers
How to Pass a Unique_Ptr Argument to a Constructor or a Function