3
How can I "hook into" Python from C++ when it executes a function? My goal is to profile
我已經打開了一個新的線程爲一個新的問題,這一點,在C++中,我怎麼能初始化PythonInterpreter然後從中調用一個方法。具體來說,我希望能夠調用cProfile的方法,並從中獲取數據。
How can I "hook into" Python from C++ when it executes a function? My goal is to profile
我已經打開了一個新的線程爲一個新的問題,這一點,在C++中,我怎麼能初始化PythonInterpreter然後從中調用一個方法。具體來說,我希望能夠調用cProfile的方法,並從中獲取數據。
好吧,會長一點。請注意,我幾乎忽略了所有「常規」錯誤檢查 - 幾乎任何python方法都可能返回NULL,在這種情況下,您應該優雅地處理它。我顯示「異常」部分檢查給定對象是否可調用。請注意,如果對象指針爲NULL,則PyDECREF失敗,Py_XDECREF不會。現在代碼 - 可能有更好的方法來解決這一切,但這對我來說很好,但遺憾的是文檔極其缺乏。
C++代碼:
#include <Python.h>
static PyThreadState *mainstate;
void initPython(){
PyEval_InitThreads();
Py_Initialize();
mainstate = PyThreadState_Swap(NULL);
PyEval_ReleaseLock();
}
void exitPython(){
PyEval_AcquireLock();
PyThreadState_Swap(mainstate);
Py_Finalize();
}
void callScript() {
PyGILState_STATE gstate = PyGILState_Ensure();
PyObject *pName = PyUnicode_FromString("Startup");
PyObject *pModule = PyImport_Import(pName);
Py_DECREF(pName);
PyObject *pFunc = PyObject_GetAttrString(pModule, "startup");
if (pFunc && PyCallable_Check(pFunc)) {
PyObject *arglist = Py_BuildValue("(u)", "TestScript");
PyObject *result = PyObject_CallObject(pFunc, arglist);
Py_DECREF(arglist);
// Now you have the returned object of the function - do something with it.
// In our case that's None, but you should extend the python scrip to return
// whatever you need - see the profiler API.
Py_DECREF(result);
}
Py_XDECREF(pFunc); // XDECREF does not fail if pointer is NULL.
Py_DECREF(pModule);
PyGILState_Release(gstate);
}
int main() {
printf("Start.\n");
initPython();
callScript();
exitPython();
printf("Exit.\n");
return 0;
}
你那總是被調用特定腳本,讓你回到你的有用方式所需的數據改變這一點 - 在我們只使用cProfile.run時刻(),它只是打印一些信息:
Startup.py
import cProfile
def startup(module_name):
print("Start script")
cProfile.run("import " + module_name)
print("Finished script")
最後被執行的瑣碎腳本:
TestScript.py
sum = 0
for i in range(10000):
sum += i
感謝VOO,我我需要更詳細地閱讀這些內容,但你已經幫了我很大的忙。再次感謝:) – easythrees
把它從一些相當複雜的代碼和它的3am拼湊在一起,所以我希望我在這裏沒有犯任何錯誤。時間去爲我睡覺:) – Voo