2012-03-21 2 views
8

Я внедряю Python в приложение C/C++, которое будет иметь определенный API.Embedded 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

+0

В Python 3 PyString_FromString ушел. Вместо этого используйте PyBytes_FromString. – edj

Смежные вопросы