我正在嘗試將一些 Python 2 代碼移植到 Python 3。在代碼中,有一個模塊在 C 部分初始化,稍后由 python 代碼呼叫。但是,我的 python 代碼沒有看到在 C 中初始化的模塊。這是一個簡化的示例:
#include <Python.h>
#include <stdio.h>
static PyMethodDef BenchMethods[] = {
{NULL, NULL, 0, NULL}
};
int main(int argc, char **argv)
{
PyObject *module;
Py_SetProgramName(argv[0]);
Py_Initialize();
static struct PyModuleDef benchdef = {
PyModuleDef_HEAD_INIT,
"bench",
NULL,
-1,
BenchMethods,
NULL,
NULL,
NULL,
NULL,
};
module = PyModule_Create(&benchdef);
if (module == NULL) {
printf("ERROR!\n");
exit(0);
}
PyRun_SimpleString("import bench");
Py_Finalize();
return 0;
}
但是,在編譯并嘗試執行它時,出現錯誤:
$ gcc -I/path/to/include/python3.9 -o bench_simple.x bench_simple.c -L/path/to/lib -lpython3.9
$ ./bench_simple.x
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'bench'
在 Python 2 版本中,模塊通過module = Py_InitModule("bench", BenchMethods);. 我根據我在這里找到的說明移植了代碼
uj5u.com熱心網友回復:
PyModule_Create()(成功時)創建一個模塊物件。它不會將該物件加載到任何解釋器中,并且已創建模塊物件這一事實不會自動將其放入任何解釋器的模塊加載路徑中。這就是import bench您的示例程式中的失敗的原因。
Python C API 檔案給出了具體的說明,由示例支持,說明嵌入 python 的應用程式如何以編程方式定義模塊并讓嵌入式解釋器加載它。簡而言之,關鍵是你的應用程式PyModule_Create()不能直接呼叫,它必須
- 定義一個模塊初始化函式,該函式進行呼叫并回傳結果,以及
PyImport_AppendInittab()在初始化解釋器之前呼叫以將該初始化函式注冊到所選模塊名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485108.html
標籤:C python-3.x
