我的设置:
.pyd
文件.pyd
文件的Legacy™Python代码问题:
很显然,MATLAB无法“浏览” .pyd
二进制文件以确定根本原因,所以这就是我要做的所有事情。
我尝试过的事情:
.pyd
模式(Debug
)构建setup.py build --debug
。 pyversion 'c:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe'
Debug
→Attach to Process
→选择MATLAB.exe
Python Error: ImportError: DLL load failed: The specified module could not be found.
my_pylib.pyd
文件重命名为my_pylib_d.pyd
(在所有位置的here中都找到了...)Python Error: ImportError: cannot import name 'my_pylib'
pyversion 'c:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python_d.exe'
(首先确保已在MSVC上下文中安装了Python3.6调试环境)。MATLAB.exe
,然后从顶部开始重复Python Error: ImportError: cannot import name 'my_pylib'
python36_d.dll
,因为该机制在MATLAB中似乎被破坏了。 MATLAB.exe
进程。numpy
,scipy
等)上触发}}和以前一样……ImportError
pyversion 'c:\wherever\Python37_64\python.exe'
哦。是的我忘了。重新启动MATLAB 再次,在 AGAIN 上方运行<speak_angrily_through_teeth>
命令,运行令人讨厌的MATLAB代码,因为忘记重新连接MSVC而在拔头发时进行SCREAM,重新启动MATLAB < strong> AGAIN ,因为它显然崩溃了,重新连接了MSVC,运行了令人不快的MATLAB代码pyversion
Success!在MATLAB触发断点后,MSVC转到我的API代码。此处触发断点:
</speak_angrily_through_teeth>
其中
PyObject *module = PyModule_Create(&moduledef);
下载Python 3.7源代码后,我可以进行更深入的研究。 static struct PyModuleDef moduledef =
{
PyModuleDef_HEAD_INIT,
"my_pylib",
NULL,
sizeof(struct module_state),
my_pylib_methods,
NULL,
my_pylib_traverse,
my_pylib_clear,
NULL
};
调用是包装器,它在PyModule_Create
中调用以下函数:
Objects/moduleobject.c
断点位于PyObject *
PyModule_Create2(struct PyModuleDef* module, int module_api_version)
{
if (!_PyImport_IsInitialized(PyThreadState_GET()->interp))
Py_FatalError("Python import machinery not initialized");
return _PyModule_CreateInitialized(module, module_api_version);
}
子句中。这意味着if()
甚至都没有关系。 moduledef
是_PyImport_IsInitialized()
中的函数:
Python/import.c
似乎不太可能导致我的AccessViolation®。进入int
_PyImport_IsInitialized(PyInterpreterState *interp)
{
if (interp->modules == NULL)
return 0;
return 1;
}
最终使我意识到:我实际上是在调试Python / C ++ API而不是我的代码...
问题: