Я пытаюсь ( копировать ) код для загрузки плагинов Python в мое приложение C ++.
Этот код хорошо работает сам по себе. Я только что добавил функцию для вызова из моего c ++ и распечатал для отладки:
import imp
import os
MainModule = "__init__"
PluginFolder = "plugins"
def getPlugins(ruta):
plugins = []
possibleplugins = os.listdir(ruta + PluginFolder)
for i in possibleplugins:
location = os.path.join(PluginFolder, i)
print (location)
print (os.path.isdir(location))
if not os.path.isdir(location) or not MainModule + ".py" in os.listdir(location):
continue
info = imp.find_module(MainModule, [location])
plugins.append({"name": i, "info": info})
return plugins
def loadPlugin(plugin):
return imp.load_module(MainModule, *plugin["info"])
def iniciar(ruta):
for i in getPlugins(ruta):
print("Loading plugin " + i["name"])
plugin = loadPlugin(i)
plugin.run()
if __name__ == "__main__":
for i in getPlugins("/myabsolutepath/python/"):
print("Loading plugin " + i["name"])
plugin = loadPlugin(i)
plugin.run()
У меня есть древовидная структура:
/myabsolutepath/python/plugins/
И у меня есть любой файл dummy.py и различные папки для исследования. Внутри одной из этих папок у меня есть init .py файл
Если я запускаю сам скрипт, у меня будет правильный результат:
plugins/dummy.py
False
plugins/C1
True
plugins/C3
True
plugins/C2
True
Теперь я пытаюсь вызвать под моей функцией C ++ (приложение Qt):
void callplugins (const char* ruta, const char* nombremodulo, const char* nombrefuncion)
{
qDebug()<<"ruta: "<<ruta;
PyObject* modulo = nullptr;
PyObject* pName = nullptr;
PyObject* listado = nullptr;
Py_Initialize();
PyObject *sysPath = PySys_GetObject((char*)"path");
PyObject *path = PyUnicode_FromString((char*)ruta);
int result = PyList_Insert(sysPath, 0, path);
if (result == 0 )
{
pName = PyUnicode_FromString(nombremodulo);
modulo = PyImport_Import(pName);
qDebug()<<"modulo "<<modulo;
PyObject *args = PyTuple_New(1);
PyObject* nombre = Py_BuildValue("s", ruta);
PyTuple_SetItem(args, 0, nombre);
Py_DECREF(path);
if (modulo)
{
pFuncion = PyObject_GetAttrString(modulo, nombrefuncion);
Py_DECREF(modulo);
if (pFuncion && PyCallable_Check(pFuncion))
{
qDebug()<<"Funcion exportar: "<<" -- "<<pFuncion;
listado = PyObject_CallObject(pFuncion,args);
Py_DECREF(args);
}
}
}
if (PyList_Check(listado))
{
qDebug()<<"okay "<<PyList_Size(listado);
// okay, it's a list
for (Py_ssize_t i = 0; i < PyList_Size(listado); ++i)
{
PyObject* siguiente = PyList_GetItem(listado, i);
qDebug()<<"Siguiente: "<<siguiente;
// do something with next
}
}
qDebug()<<"Cargados los modulos";
}
И я получаю все ложное:
plugins/dummy.py
False
plugins/C1
False
plugins/C3
False
plugins/C2
False