在嵌入式python 3中以编程方式定义包结构

在嵌入式python 3中以编程方式定义包结构,python,c++,python-3.x,Python,C++,Python 3.x,我想创建一个嵌入式python 3解释器,让python脚本导入通过C python API创建的模块 创建“顶级”模块没有问题,但现在我想将模块组织在包中。。。但我失败了 以下是我当前的(简单)代码: 现在我得到了这个错误: Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named 'emb.sub' 回溯(最近一次呼叫最

我想创建一个嵌入式python 3解释器,让python脚本导入通过C python API创建的模块

创建“顶级”模块没有问题,但现在我想将模块组织在包中。。。但我失败了

以下是我当前的(简单)代码:

现在我得到了这个错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named 'emb.sub'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
导入错误:没有名为“emb.sub”的模块
我想知道是否有可能在嵌入式python中创建包和模块的层次结构


谢谢

据我所知,默认内置模块处理与包+模块名称不匹配。这可以通过添加一个自定义导入挂钩来解决,只需在Py_Initialize()之后运行它:

我用您的完整代码成功地尝试了这一点:

#include <Python.h>

//// Definition of 'emb' module
static PyModuleDef EmbModule = {
    PyModuleDef_HEAD_INIT, "emb", NULL, -1, NULL,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void)
{
    PyObject *mod = PyModule_Create(&EmbModule);
    PyModule_AddObject(mod, "__path__", Py_BuildValue("()"));

    return mod;
}

//// Definition of 'emb.sub' module
static PyObject* emb_sub_foo(PyObject *self, PyObject *args)
{
    char const* n = "I am sub foo";
    return Py_BuildValue("s", n);
}
static PyMethodDef EmbSubMethods[] = {
    {"foo", emb_sub_foo, METH_VARARGS, "Returns sub foo"},
    {NULL, NULL, 0, NULL}
};
static PyModuleDef EmbSubModule = {
    PyModuleDef_HEAD_INIT, "emb.sub", NULL, -1, EmbSubMethods,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb_sub(void)
{
    return PyModule_Create(&EmbSubModule);
}

//// Embedded Python
int main()
{
    PyImport_AppendInittab("emb", &PyInit_emb);
    PyImport_AppendInittab("emb.sub", &PyInit_emb_sub);
    Py_Initialize();

    PyRun_SimpleString(
        "import importlib.abc\n" \
        "import importlib.machinery\n" \
        "import sys\n" \
        "\n" \
        "\n" \
        "class Finder(importlib.abc.MetaPathFinder):\n" \
        "    def find_spec(self, fullname, path, target=None):\n" \
        "        if fullname in sys.builtin_module_names:\n" \
        "            return importlib.machinery.ModuleSpec(\n" \
        "                fullname,\n" \
        "                importlib.machinery.BuiltinImporter,\n" \
        "            )\n" \
        "\n" \
        "\n" \
        "sys.meta_path.append(Finder())\n" \
    );

    PyRun_SimpleString("import emb.sub\n");
    PyRun_SimpleString("print(emb.sub.foo())\n");

    Py_Finalize();
    return 0;
}
#包括
////“教统局”模式的定义
静态PyModuleDef emb模块={
PyModuleDef\u HEAD\u INIT,“emb”,NULL,-1,NULL,
空,空,空,空
};
静态PyObject*PyInit_emb(void)
{
PyObject*mod=PyModule\u创建(&EmbModule);
PyModule_AddObject(mod,“uuu路径”,Py_构建值(“()”);
返回模式;
}
////“emb.sub”模块的定义
静态PyObject*emb\u sub\u foo(PyObject*self,PyObject*args)
{
char const*n=“我是子foo”;
返回Py_BuildValue(“s”,n);
}
静态PyMethodDef EmbSubMethods[]={
{“foo”,emb_sub_foo,METH_VARARGS,“Returns sub foo”},
{NULL,NULL,0,NULL}
};
静态PyModuleDef EmbSubModule={
PyModuleDef\u HEAD\u INIT,“emb.sub”,NULL,-1,EmbSubMethods,
空,空,空,空
};
静态PyObject*PyInit\u emb\u sub(void)
{
返回PyModule\u创建(&EmbSubModule);
}
////嵌入式Python
int main()
{
PyImport_AppendInittab(“emb”&PyInit_emb);
PyImport_AppendInittab(“emb.sub”和PyInit_emb_sub);
Py_初始化();
皮伦·欧·斯普勒斯特林(
“导入导入lib.abc\n”\
“导入导入库机械\n”\
“导入系统\n”\
“\n”\
“\n”\
“类查找器(importlib.abc.MetaPathFinder):\n”\
def find_spec(self、fullname、path、target=None):\n\
“如果系统内置模块名称中有全名:\n”\
“返回importlib.machine.modulespect(\n”\
全名,\n\
importlib.machinery.BuiltinImporter\n\
“”\n“\
“\n”\
“\n”\
“sys.meta\u path.append(Finder())\n”\
);
PyRun_SimpleString(“导入emb.sub”);
PyRun_SimpleString(“print(emb.sub.foo())\n”);
Py_Finalize();
返回0;
}

你找到解决方案了吗?@ha11owe最后,我没有使用软件包,但接受了回复。先生,你救了我的命!谢谢
#include <Python.h>

//// Definition of 'emb' module
static PyModuleDef EmbModule = {
    PyModuleDef_HEAD_INIT, "emb", NULL, -1, NULL,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void)
{
    PyObject *mod = PyModule_Create(&EmbModule);
    PyModule_AddObject(mod, "__path__", Py_BuildValue("()"));

    return mod;
}

//// Definition of 'emb.sub' module
static PyObject* emb_sub_foo(PyObject *self, PyObject *args)
{
    char const* n = "I am sub foo";
    return Py_BuildValue("s", n);
}
static PyMethodDef EmbSubMethods[] = {
    {"foo", emb_sub_foo, METH_VARARGS, "Returns sub foo"},
    {NULL, NULL, 0, NULL}
};
static PyModuleDef EmbSubModule = {
    PyModuleDef_HEAD_INIT, "emb.sub", NULL, -1, EmbSubMethods,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb_sub(void)
{
    return PyModule_Create(&EmbSubModule);
}

//// Embedded Python
int main()
{
    PyImport_AppendInittab("emb", &PyInit_emb);
    PyImport_AppendInittab("emb.sub", &PyInit_emb_sub);
    Py_Initialize();

    PyRun_SimpleString("import emb.sub\n");

    Py_Finalize();
    return 0;
}
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named 'emb.sub'
PyRun_SimpleString(
    "import importlib.abc\n" \
    "import importlib.machinery\n" \
    "import sys\n" \
    "\n" \
    "\n" \
    "class Finder(importlib.abc.MetaPathFinder):\n" \
    "    def find_spec(self, fullname, path, target=None):\n" \
    "        if fullname in sys.builtin_module_names:\n" \
    "            return importlib.machinery.ModuleSpec(\n" \
    "                fullname,\n" \
    "                importlib.machinery.BuiltinImporter,\n" \
    "            )\n" \
    "\n" \
    "\n" \
    "sys.meta_path.append(Finder())\n" \
);
#include <Python.h>

//// Definition of 'emb' module
static PyModuleDef EmbModule = {
    PyModuleDef_HEAD_INIT, "emb", NULL, -1, NULL,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb(void)
{
    PyObject *mod = PyModule_Create(&EmbModule);
    PyModule_AddObject(mod, "__path__", Py_BuildValue("()"));

    return mod;
}

//// Definition of 'emb.sub' module
static PyObject* emb_sub_foo(PyObject *self, PyObject *args)
{
    char const* n = "I am sub foo";
    return Py_BuildValue("s", n);
}
static PyMethodDef EmbSubMethods[] = {
    {"foo", emb_sub_foo, METH_VARARGS, "Returns sub foo"},
    {NULL, NULL, 0, NULL}
};
static PyModuleDef EmbSubModule = {
    PyModuleDef_HEAD_INIT, "emb.sub", NULL, -1, EmbSubMethods,
    NULL, NULL, NULL, NULL
};
static PyObject* PyInit_emb_sub(void)
{
    return PyModule_Create(&EmbSubModule);
}

//// Embedded Python
int main()
{
    PyImport_AppendInittab("emb", &PyInit_emb);
    PyImport_AppendInittab("emb.sub", &PyInit_emb_sub);
    Py_Initialize();

    PyRun_SimpleString(
        "import importlib.abc\n" \
        "import importlib.machinery\n" \
        "import sys\n" \
        "\n" \
        "\n" \
        "class Finder(importlib.abc.MetaPathFinder):\n" \
        "    def find_spec(self, fullname, path, target=None):\n" \
        "        if fullname in sys.builtin_module_names:\n" \
        "            return importlib.machinery.ModuleSpec(\n" \
        "                fullname,\n" \
        "                importlib.machinery.BuiltinImporter,\n" \
        "            )\n" \
        "\n" \
        "\n" \
        "sys.meta_path.append(Finder())\n" \
    );

    PyRun_SimpleString("import emb.sub\n");
    PyRun_SimpleString("print(emb.sub.foo())\n");

    Py_Finalize();
    return 0;
}