操作系统路径.isdir如果我从C++调用它就不起作用了

2024-04-26 17:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试(copying)一个加载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/

我也有假人.py用于探测的文件和各种文件夹。在其中一个文件夹中,我有一个init.py文件

如果我运行脚本本身,我会得到一个正确的结果:

plugins/dummy.py
False
plugins/C1
True
plugins/C3
True
plugins/C2
True

现在我尝试在C++函数(qt应用程序)下调用:< /p>

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

Tags: pathpyfalseifospluginslocationplugin