Python,从Python/Blender的发行版加载调试模块
我正在为Blender写一个导出脚本,这个脚本使用Python来处理各种插件。因为我大部分的代码都是用C++写的,所以我决定把我的代码封装成一个Python模块(pyd),这样可以从导出脚本中导入并传递所有相关的信息进行转换。
只要我制作的是发布版本,Blender就能正常加载这个模块,我甚至可以用Visual Studio进行调试。但是为了修复一个bug,发布版本并不可靠,所以我需要使用模块的调试版本。不幸的是,在这种情况下,模块无法加载。
从Python控制台来看:
>>> import exporter_d
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
ImportError: DLL load failed: The specified module could not be found.
我查了一下,发现错误是因为找不到另一个dll文件。由于我没有加载其他任何东西,所以我把调试版本的Python和我的模块一起添加了进去。现在错误变了:
Traceback (most recent call last):
File "<blender_console>", line 1, in <module>
ImportError: dynamic module does not define init function (PyInit_exporter_d)
于是,我把模块的初始化名称从“PyInit_exporter”改成了“PyInit_exporter_d”(并且删除了调试版本的pythond.dll,因为它让Blender崩溃了)。结果又返回了第一个错误(dll加载失败)。
所以,我的问题是,如何在运行Python的发布版本时加载Python模块的调试版本?因为Python是嵌入在Blender里的,我想避免下载源代码并重新编译它。
2 个回答
我成功在Python扩展中让调试在本地代码中工作了:使用了调试版和发布版的Python库混合,但我用了些小技巧:
- 在“发布模式下带调试信息”构建你的本地库:可以参考这个链接 https://learn.microsoft.com/en-us/cpp/build/how-to-debug-a-release-build?view=vs-2019
- 在你的模块上运行命令 python.exe setup.py build_ext --compiler=msvc --inplace 来构建你的扩展。这只是为了查看编译器工具链的命令
- 把这些命令复制粘贴到一个.bat文件中
- 修改这些命令:启用调试符号 (/Zi),禁用优化 (/Od) 等等。
把 /Ox 改成 /Od
在编译器标志中添加 /Zi
在链接器标志中添加 /DEBUG
- 现在手动构建你的扩展,而不是使用python的distutils
待办事项:把这些改动整合进Python的distutils中:为Visual Studio工具链添加一个“--build --relWithDebInfo”标志
这是设置环境的方法,这样你就可以同时使用调试版和发布版的构建:
在你的C++代码中,你需要包含
PyMODINIT_FUNC initmyExporter(void)
在你的Visual Studio解决方案中(或者你用来指定代码编译结果名称的工具),你需要写
<path_to_some_folder>\myExporter_d.pyd for Debug mode
还有
<path_to_some_folder>\myExporter.pyd for Release mode
在导入时,使用
import myExporter
同时使用python.exe和python_d.exe