Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling Python script from C++ and using its output

I want to call a python script from C++ and wish to use the output .csv file generated by this script back into C++. I tried this in main():

std::string filename = "/home/abc/xyz/script.py"; std::string command = "python "; command += filename; system(command.c_str()); 

This does call and execute the python script.

The print commands in the Python are being executed. Things are being printed on the screen when the script is called. So far so good. However, it is not creating the .csv file (part of the same script).

Example: I had a training.csv file with 100 entries. I called the Python script, with little changes to the script so that the training.csv file now should contain only 50 entries instead of 100. It’s overwritten. However, no such thing happening. Rest of the commands in the script (print, etc) are working perfectly.

The training.csv file is to be read with C++ normally using fstream and getline.

Any idea how to do it (using Linux)?

like image 862
learner Avatar asked Jun 06 '13 12:06

learner


People also ask

Can C call Python function?

We can call a C function from Python program using the ctypes module.

Can we call Python code from C++?

Embeding the Python interpreter inside your C++ app will let you run Python programs using your application run Python scripts. It will also make it easier possible for those scripts to call C++ functions in your application.

How to call a python function from c?

The code below focuses on the tricky parts that are involved in calling Python from C. Code #1 : [Step 1 and 2] Own the GIL and Verify that function is a proper callable Code #2 : Building Arguments, calling function, Check for Python exceptions Create the return value, Restore previous GIL state and return.

How do I call a python script from another process?

Calling Python Script Using New Process Initialization. The main idea here is to call the script using a newly initialized process and get its standard output. This method needs an external Python interpreter to actually execute the script.

How to convert C++ code to Python?

Now that the C++ code is ready you need to write the Python code that will be called. Creating the Python File. Next you should add the Python function “add” that will be called from C++ to a file named “Sample.py”. The code for this function is: # Returns the sum of two numbers.

How do I run a python script from a C program?

Essentially, running a Python script from C# can be done either with IronPython dll referenced within your C# project and using the IronPython.Hosting library; or via kicking off a process that executes a Python program. The advantage of the later is that the script can be written in any Python flavor, provided you have installed ...


2 Answers

Here is a solution to embed the execution of your python module from within your C++ application. It's not better or worst than forking/executing your python script through a system call, it just is a different way to do it. Whether it is best or not depend on your context and usage.

Some time ago I have coded a way to load python modules as plugins to a C++ application, here's the interesting part.

Basically, you need to #include <Python.h>, then Py_Initialize() to start your python interpreter.

Then you do import sys, using : PyRun_SimpleString("import sys");, and you can load your plugin by doing PyRun_SimpleString('sys.path.append("path/to/my/module/")').

To exchange values between C++ and Python, things get harder, you have to to transform all your C++ objects into python objects (starting line 69 in my script).

Then you can call your function using PyObject_Call_Object(...), using all the python objects you created as arguments.

You get the return value, and transforms all those values in C++ objects. And don't forget the memory management in all that!

To end your python interpreter, a simple call to Py_Finalize().

It really looks harder than it is really, but you have to be really careful doing this, because it could lead to leaks, security issues etc..

like image 113
zmo Avatar answered Oct 20 '22 09:10

zmo


Try using POSIX's popen() instead of system(). It pipes stdin/stdout of child process to returned file handle.

FILE* in = popen(command.c_str(), "r");  fscanf(in, ... // or some other method of reading  pclose(in); 
like image 31
Vovanium Avatar answered Oct 20 '22 09:10

Vovanium