Встроенный Python 2.7.2 Импорт модуля из пользовательского каталога

Я встраиваю Python в приложение C / C ++, которое будет иметь определенный API.

Приложению необходимо создать экземпляры классов, определенных в сценарии, которые имеют примерно такую ​​структуру:

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);

Эти строки работают нормально, но не влияют на работу моего кода. Очевидно, в моем реальном коде есть множество проверок ошибок, которые я исключил, так что не беспокойтесь об этом!

Итак, мой вопрос: как мне соответствующим образом направить встроенный интерпретатор в мои сценарии, чтобы я мог создавать экземпляры классов?


person Fritz    schedule 21.03.2012    source источник


Ответы (1)


вам нужно указать 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;
}
person sherpya    schedule 22.03.2012
comment
Большое спасибо - это помогло мне пройти сквозь стену! Теперь выясним, что не так с тестовым сценарием, который я вызываю! - person Fritz; 22.03.2012
comment
В Python 3 PyString_FromString больше нет. Вместо этого используйте PyBytes_FromString. - person edj; 27.06.2017
comment
Что делает path в PySys_GetObject("path");? Зачем это нужно? - person sAguinaga; 15.05.2018