如何在python 3.x中初始化模块以便可以导入?

时间:2019-04-15 11:18:23

标签: python python-3.x python-2.7

Python 2.7 我愿意

void InitPython()
{
    ..
    Py_InitModule3("my_prog", ProgMethods, "documentation");
    ..
}

然后我将可以在我的代码中像这样执行import my_prog

char strCode[] = "import my_prog, sys, os\n"

PyRun_SimpleString(strCode);


但是在 Python 3.6 ,遵循官方文档并应用更改无效

static struct PyModuleDef moduledef = {
    PyModuleDef_HEAD_INIT,
    "my_prog",                          /* m_name */
    "documentation",                    /* m_doc */
    -1,                                 /* m_size */
    ProgMethods,                        /* m_methods */
    NULL,                               /* m_reload */
    NULL,                               /* m_traverse */
    NULL,                               /* m_clear */
    NULL,                               /* m_free */
};

void InitPython()
{
    ..
    PyObject *m1 = PyModule_Create(&moduledef);
    ..
}

失败,并出现以下错误:

  

ModuleNotFoundError:没有名为“ my_prog”的模块

该如何解决?

1 个答案:

答案 0 :(得分:1)

documentation I can find表示您的初始化函数应命名为PyInit_mymodule并标记为PyMODINIT_FUNC

static PyMethodDef SpamMethods[] = {
    // ...
    {"system",  spam_system, METH_VARARGS, "Execute a shell command."},
    // ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

// ...

static struct PyModuleDef spammodule = {
    PyModuleDef_HEAD_INIT,
    "spam",
    spam_doc,
    -1,
    SpamMethods
};

// ...

PyMODINIT_FUNC
PyInit_spam(void)
{
    return PyModule_Create(&spammodule);
}

(顺便说一句,除非您确实需要在C中创建扩展名,否则我建议也查看Cython。)