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)?
We can call a C function from Python program using the ctypes module.
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.
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.
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.
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.
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 ...
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..
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With