Embedding Python in a CPP Project - python

I am making a game engine in cpp and I want to add python scripting support. I want the python script to be able to access classes from my cpp API and cpp to be able to call functions on the script for example Update(Delta time) every frame. Im using Visual Studio 2017. The cpp should be the host of the python code.
How should I interface with a python VM in my cpp VS2017 project ?
How should I give the script access to cpp classes ?
To clarify:
This is not a debugging question it's a design question.
It's important to me to have full control of the python environment.
This is not a python project extended with CPP performance code.
It should be a native unmanaged cpp project extended with python scripting support.

Related

How to distribute C++ application which calls Python?

I know there is some way to call Python from C++, like Python/C API or Boost.Python. My question is, how can I distribute the application? For example, does user still need to install Python and Python packages on their machine?
My user case is: I want to use some Python code from my C++ code. The main application is written in C++. Then I am going to deploy my app. The goal is to make the app self contained, and user don't need to install Python and Python packages at all.
The possible steps may be :
1, calling Python from C++ via Python/C API or boost.Python from source code.
2, bring Python/C libraries together with application.
I hope after these 2 steps, my app will be a self-contained and standalone software. User can just copy the app folder to any other machines which has no Python installed.
Note that due to license issue, I can not use PyInstaller. I also meet some problems when trying to use "Nuitka" to make the Python part self contained. So I am now trying directly calling Python from C++. I know it will run on my developer machine. But needs to confirm that this solution can also make app self-contained and won't ask user to install Python.
Update: Now I feel I need to do something to make my app self-contained if I use Python/C to call python from C++ :
1, I need to bring all needed runtime with my app. (C++ runtime of course, and the python_version.dll)
2, I need to deploy a Python interpreter inside my app. Simply copy the Python folder from Python installation and remove some not needed files (like header files, lib files)
3, use Py_SetPythonHome function to points to the copied Python interpreter inside the app.
I'd say you're on the right track. Basically, you should obtain a Python (shared or static) library, compile your program with it, and of course bundle the Python dependencies you have with your program. The best documentation I've read is available here: https://docs.python.org/3.8/extending/embedding.html#embedding-python-in-another-application. Roughly, the process is:
Get a Python library from python.org and compile with ./configure --enable-shared (I believe omitting --enable-shared does only produce the python binary).
Compile your program. Have it reference the headers under Include and link the library. Note that you can obtain the compiler and linker flags you need as described here.
Call Python code from within your application using e.g. PyRun_SimpleString() or other functions from the C API. Note that you may also depend on the Python standard library (under Lib in the distribution) if there's any functionality you use from it.
If you linked against Python statically, at this point you're done, aside from bundling any Python code you depend on, which I'm not sure is relevant in your case.
I am suffering from the same problem, I had a project which is made up of C++ and python(embedded) and there is a problem of deployment/distribution.
After research, I got a solution which is not perfect (means it will be helpful to run your app in other system)
change visual studio in release mode and compile(you got a folder in your working directory)
install pyinstaller (pip install pyinstaller)
then navigate to pyinstaller folder and command:-pyinstaller.exe "your script_file_path.py"
-it will create a dist folder
copy that folder in working folder where exe exists.
remember.
dist folder and c/python code compiled by same version of python.
now good to go.
it will work.

How to profile a python extension module from Visual Studio 2015

I have a C++ static library .lib that I wrap with cython to create a python extension module. I have been able to build the library and extension module with debug information and attach the Visual Studio Community 2015 debugger to the python process and debug the C++ code.
Now I would like to profile the C++ code using instrumentation. If I chose the VS2015 performance wizard option for instrumentation I can only select projects that are either executables or dlls, I can't select the static library project where my code is. I guess that if I could direct VS to use the python .pyd extension module that may work as it's a dll. However, I don't know how to do that.
I have also tried to find some way of starting the profiler while having the debugger attached to the python process, the same way I do for debugging the C++ code, but I haven't found a way. I can see the PerfTips while stepping through the code, but that's not enough.
Does anybody know how could I profile the C++ code in this static library?
Ultimately, if I can't find a way, I could create another VS2015 executable project and call my lib code from there, then profile the executable project. The only inconvenience with this approach is that I'm passing a few multidimensional arrays from python to the extension module and I would have to first save them from python and then load them in the C++ executable project. I'm not sure how will I do it, but it's doable. It would just be a lot more convenient for me if I was able to profile the C++ lib code when being called from python as I'm going to be doing that multiple times in the future and having to save the python data and then loading it from C++ each time it's a bit of a hassle.

How is Python automating C++ Application?

I do automation and currently automating an application made with QT (C++).
I use Squish to do this using Python scripting language.
Can someone explain me exactly how a Python variable can be assigned a C++ Object?
Do you need to refer C++ built-in types (int, long, char, wchar_t, etc.) and arrays in Python code? If so you need to use ctypes Python package. Here is an example of calling C++ dll function from Python. If you need to send Window message (like WM_CLICK) take a look at ctypes.Structure class. There are some examples of C structures declared in Python code.
EDIT: Currently I know 2 open source projects about QT GUI automation.
funq
GammaRay
Also it's possible to build and run QT app with accessibility features for Windows UIA and Linux AT-SPI.

How to pass environment variable from squishGUI python to C++ Visual Studio project

I have a GUI application in C++ Visual Studio and a project in squishGUI using python language.
The squishGUI project is to do automation test for C++ application.
I want to have a variable in squishGUI and pass it to C++ VS project as environment variable (or as anything else that can fix my below purpose...).
My purpose is that, in C++ source code, I can use that environment variable for other processes (e.g. flow control, branch condition, etc...)
In other words, is it possible to have a communication (e.g. variable sharing, data transfer...) between squishGUI python and C++ VS project?
Any help or suggestion is highly appreciated and thanked :)

Embedding Python with basic IDE

My company has a C/C++ application developed using Visual Studio. Currently we have a Visual Basic plugin which lets you open a built-in text editor and run VB code. This built-in text editor gives the user all the basic debugging tools (break, watch, step...). I was wondering how could I do that using Python. The tricky part is that the python interpreter has to be launched from inside the main application, so that they have access to the same memory space.
I already have a swig interface for the application API and did a proof of concept VB script in which I loaded Python as a DLL and executed a script as described here. This works perfectly when I am sure the script has no bugs, but it would be much easier if I could have some sort of interface which I can debug the script being executed.
I had a look into the pdb module, but it dosent look like the way to go. If someone could just point me into the right direction it would be much appreciated.
I've had some luck embedding Spyder in a C/C++ program that I had created wrappers for (using PySide). Since the wrappers included the main application logic, I turned the program into a python application and then embedded Spyder using one of their examples.
However, it uses pdb or winpdb under the hood, so complete functionality is still not there IMHO.

Categories