"No module named '_<module>'" 导入带有嵌入式 Python 的 SWIG 模块时
"No module named '_<module>'" when importing a SWIG module with embedded Python
我正在尝试将 SWIG 与嵌入式 Python 3.5.2 一起使用。以下构建为 Windows 控制台应用程序。当它尝试导入 C++ 端 SWIG 模块“_arpy”时,它无法初始化 Python 端 SWIG 模块 "arpy.py"。我(可能不正确)理解 C++ 端“_arpy”模块应该已经由从 main() 调用的 SWIG 模块初始化函数加载,但情况似乎并非如此。
arpy.i:
%module arpy
%{
#include "arpy.h"
%}
%include <windows.i>
int test();
arpy.h:
#pragma once
int test();
swig -python -c++ arpy.i
生成:
arpy_wrap.cxx
arpy.py
main.cpp:
#include <Python.h>
extern "C" PyObject* PyInit__arpy();
int main()
{
Py_Initialize();
PyInit__arpy(); // is this the right call to "import" the module?
PyRun_SimpleString("import arpy");
return 0;
}
int test()
{
return 1;
}
输出:
Traceback (most recent call last):
File "C:\Personal\Aue\Python\arpy.py", line 18, in swig_import_helper
return importlib.import_module(mname)
File "C:rdParty\lib\Python\Python-3.5.2\Lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named '_arpy'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Personal\Aue\Python\arpy.py", line 21, in <module>
_arpy = swig_import_helper()
File "C:\Personal\Aue\Python\arpy.py", line 20, in swig_import_helper
return importlib.import_module('_arpy')
File "C:rdParty\lib\Python\Python-3.5.2\Lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: No module named '_arpy'
Python 是 运行 在“_arpy”上使用 importlib.import_module 失败的 arpy.py 初始化代码。在 main() 中调用 PyInit__arpy() 我认为应该是 "importing" SWIG 通过 CPython/C API 生成的 _arpy 模块但显然这一切都不起作用猜测。
来自此处的示例:(https://docs.python.org/3/extending/embedding.html)
我看到要将 SWIG C++ 模块作为内置模块导入,您需要:
PyImport_AppendInittab("_arpy", &PyInit__arpy);
在调用 Py_Initialize()
之前
现在一切正常。
我正在尝试将 SWIG 与嵌入式 Python 3.5.2 一起使用。以下构建为 Windows 控制台应用程序。当它尝试导入 C++ 端 SWIG 模块“_arpy”时,它无法初始化 Python 端 SWIG 模块 "arpy.py"。我(可能不正确)理解 C++ 端“_arpy”模块应该已经由从 main() 调用的 SWIG 模块初始化函数加载,但情况似乎并非如此。
arpy.i:
%module arpy
%{
#include "arpy.h"
%}
%include <windows.i>
int test();
arpy.h:
#pragma once
int test();
swig -python -c++ arpy.i
生成:
arpy_wrap.cxx
arpy.py
main.cpp:
#include <Python.h>
extern "C" PyObject* PyInit__arpy();
int main()
{
Py_Initialize();
PyInit__arpy(); // is this the right call to "import" the module?
PyRun_SimpleString("import arpy");
return 0;
}
int test()
{
return 1;
}
输出:
Traceback (most recent call last):
File "C:\Personal\Aue\Python\arpy.py", line 18, in swig_import_helper
return importlib.import_module(mname)
File "C:rdParty\lib\Python\Python-3.5.2\Lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named '_arpy'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Personal\Aue\Python\arpy.py", line 21, in <module>
_arpy = swig_import_helper()
File "C:\Personal\Aue\Python\arpy.py", line 20, in swig_import_helper
return importlib.import_module('_arpy')
File "C:rdParty\lib\Python\Python-3.5.2\Lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: No module named '_arpy'
Python 是 运行 在“_arpy”上使用 importlib.import_module 失败的 arpy.py 初始化代码。在 main() 中调用 PyInit__arpy() 我认为应该是 "importing" SWIG 通过 CPython/C API 生成的 _arpy 模块但显然这一切都不起作用猜测。
来自此处的示例:(https://docs.python.org/3/extending/embedding.html) 我看到要将 SWIG C++ 模块作为内置模块导入,您需要:
PyImport_AppendInittab("_arpy", &PyInit__arpy);
在调用 Py_Initialize()
之前现在一切正常。