2011-08-12 34 views

回答

0

好吧,會長一點。請注意,我幾乎忽略了所有「常規」錯誤檢查 - 幾乎任何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 
+0

感謝VOO,我我需要更詳細地閱讀這些內容,但你已經幫了我很大的忙。再次感謝:) – easythrees

+1

把它從一些相當複雜的代碼和它的3am拼湊在一起,所以我希望我在這裏沒有犯任何錯誤。時間去爲我睡覺:) – Voo