2012-03-21 56 views
8

我將Python嵌入到將定義API的C/C++應用程序中。嵌入式Python 2.7.2從用戶定義的目錄導入模塊

應用程序需要實例化一個腳本定義的類,這是大致的結構是這樣的:

class userscript1: 
    def __init__(self): 
     ##do something here... 

    def method1(self): 
     ## method that can be called by the C/C++ app...etc 

我已經在過去管理(用於驗證的概念)來完成這件事使用以下類型的代碼:

PyObject* pName = PyString_FromString("userscript.py"); 
PyObject* pModule = PyImport_Import(pName); 
PyObject* pDict = PyModule_GetDict(pModule); 
PyObject* pClass = PyDict_GetItemString(pDict, "userscript"); 
PyObject* scriptHandle = PyObject_CallObject(pClass, NULL); 

現在,我更多的生產環境中,這種失敗在PyImport_Import行 - 我想這可能是因爲我想要添加目錄的腳本名稱,例如

PyObject* pName = PyString_FromString("E:\\scriptlocation\\userscript.py"); 

現在,給你什麼,我已經試過一個想法,我試着修改所有這些調用之前的系統路徑,使搜索此模塊。基本上嘗試以編程方式修改sys.path:

PyObject* sysPath = PySys_GetObject("path"); 
PyObject* path = PyString_FromString(scriptDirectoryName); 
int result = PyList_Insert(sysPath, 0, path); 

這些行運行正常,但沒有影響使我的代碼工作。顯然,我真正的代碼有一大堆的錯誤檢查,我排除了,所以不用擔心!

所以我的問題:我如何直接將嵌入式解釋器指向我的腳本,以便我可以實例化這些類?

回答

16

你需要指定userscript,而不是userscript.py還用PyImport_ImportModule直接花費char *

userscript.py意味着模塊py封裝userscript

此代碼的工作對我來說:

#include <stdio.h> 
#include <stdlib.h> 
#include <Python.h> 

int main(void) 
{ 
    const char *scriptDirectoryName = "/tmp"; 
    Py_Initialize(); 
    PyObject *sysPath = PySys_GetObject("path"); 
    PyObject *path = PyString_FromString(scriptDirectoryName); 
    int result = PyList_Insert(sysPath, 0, path); 
    PyObject *pModule = PyImport_ImportModule("userscript"); 
    if (PyErr_Occurred()) 
     PyErr_Print(); 
    printf("%p\n", pModule); 
    Py_Finalize(); 
    return 0; 
} 
+1

非常感謝 - 這讓我穿過了牆!現在來弄清楚我所調用的測試腳本有什麼問題! – Fritz 2012-03-22 00:46:18

+0

在Python 3中,PyString_FromString消失了。改用PyBytes_FromString。 – edj 2017-06-27 15:44:09