Can C++ execute python? [SOLVED]
-
On 25/09/2014 at 16:28, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 14
Platform: Mac OSX ;
Language(s) : C++ ;---------
is it possible to run some Python code inside a C++ plugin?
I mean, can I embed some Python code inside a C++ plugin so that it executes a bit of Python while being executed? -
On 25/09/2014 at 18:34, xxxxxxxx wrote:
I suppose that from a simple perspective, you should be able to execute a Python script from C++ using the C++ SDK. But whether this is possible or not from the C++ SDK, I don't know. It may be as simple as CallCommand() with the Python plugin's ID. Have you checked the C++ SDK docs?
-
On 26/09/2014 at 01:51, xxxxxxxx wrote:
Hi Rui,
Python scripts can be loaded and executed with the ID_PYTHONSCRIPT node.
The example in its documentation isn't currently complete and useful:
'fn' variable for the ReadHyperFile() call is the filename of the script to load.
Send MSG_SCRIPT_EXECUTE instead of MSG_SCRIPT_RETRIEVEBITMAP to execute the script. -
On 26/09/2014 at 02:41, xxxxxxxx wrote:
But the script had to be already typed and saved, right?
What I was thinking was something like this:I have a python script, like, for example, this (this is a very simple script, just for the sake of example) :
if __name__ == "__main__":
return "ABC"I would save this as, for example, test.pyp
Then I would protect it with Cinema 4D's "Source Protector" to create a .pype and/or .pypv file.
Then, if possible, I would like to load and run the script from C++, getting a return value.
It would be something like:String result;
result=Some_way_to_call_the_Python_Script();and get the result from it.
Better yet, if was possible to pass parameters along to the script.
Is this in any way possible? -
On 26/09/2014 at 07:53, xxxxxxxx wrote:
These examples are pulled from my notes.
They seem to indicate that the file extension in each case is important.
So you might not be able to use an encrypted python file.//This code loads and executes a saved coffee script file //NOTE: The script file has to be saved from C4D in the .CSC file format BaseDocument *doc = GetActiveDocument(); Filename fn = "C:\\Users\\user\\Desktop\\test.CSC"; BaseList2D *op=(BaseList2D* )AllocListNode(ID_COFFEESCRIPT); if(op && ReadHyperFile(doc, op, fn,'scrp', nullptr) == FILEERROR_NONE) { op->Message(MSG_SCRIPT_EXECUTE, nullptr); //Print's the text of the script String scriptText = op->GetDataInstance()->GetString(COFFEESCRIPT_TEXT); GePrint(scriptText); } //Delete the Python script node blDelete(op); //This is how to execute a saved Python script in R13 & R14 //NOTE: The script file has to be saved from C4D in the .py file format Filename fn = "C:\\Users\\user\\Desktop\\test.py"; AutoAlloc<BaseFile> file; //Allocate a Python script node BaseList2D* op = (BaseList2D* )AllocListNode(ID_PYTHONSCRIPT); if(op!=nullptr && file->Open(fn)) { BaseContainer *data = op->GetDataInstance(); if(data==nullptr) return FALSE; //Allocate a memory buffer to hold the Python script file LONG length = file->GetLength(); char *text = new char[length+1]; if(text == nullptr) return FALSE; //Read the Python script one character at a time char ch; while(file->ReadChar(&ch)) { text[file->GetPosition()-1] = ch; } //Set the Python script text in the Python script node container data->SetString(PYTHONSCRIPT_TEXT, text); //Do not forget to delete the memory buffer for the script text text[length] = '\0'; delete[] text; //Execute the script op->Message(MSG_SCRIPT_EXECUTE, nullptr); //Print's the text of the script String scriptText = op->GetDataInstance()->GetString(PYTHONSCRIPT_TEXT); GePrint(scriptText); } //Delete the Python script node blDelete(op); //This is how to execute a python script in R15 Filename fname = "C:\\Users\\user\\Desktop\\test.py"; AutoAlloc<BaseFile> file; //Allocate a Python script node BaseList2D* op = (BaseList2D* )AllocListNode(ID_PYTHONSCRIPT); if(op!=nullptr && file->Open(fname)) { BaseContainer* data = op->GetDataInstance(); if(data==nullptr) return false; //Allocate a memory buffer to hold the Python script file Int64 length = file->GetLength(); Char* text = NewMem(Char, length+1); if (text==nullptr) return false; //Read the Python script Char ch; while (file->ReadChar(&ch)) text[file->GetPosition()-1]= ch; text[length] = '\0'; //Set the Python script text in the Python script node container data->SetString(PYTHONSCRIPT_TEXT, text); //Do not forget to delete the memory buffer for the script text DeleteMem(text); //Execute the script op->Message(MSG_SCRIPT_EXECUTE, nullptr); } // Delete the Python script node blDelete(op);
-ScottA
-
On 26/09/2014 at 10:27, xxxxxxxx wrote:
Well, I guess this will help me a lot
Even if the python script needs to be in .py (meaning that is ASCII and easy to read, I can encrypt it internally or even store it internally (not in a file).
The only problem I see here is that I can't return values from the python script to use in C++.
I will give this a try. Thank you very much, Scott