Python,从Python/Blender的发行版加载调试模块

1 投票
2 回答
2266 浏览
提问于 2025-04-16 15:24

我正在为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 个回答

0

我成功在Python扩展中让调试在本地代码中工作了:使用了调试版和发布版的Python库混合,但我用了些小技巧:

  1. 在“发布模式下带调试信息”构建你的本地库:可以参考这个链接 https://learn.microsoft.com/en-us/cpp/build/how-to-debug-a-release-build?view=vs-2019
  2. 在你的模块上运行命令 python.exe setup.py build_ext --compiler=msvc --inplace 来构建你的扩展。这只是为了查看编译器工具链的命令
  3. 把这些命令复制粘贴到一个.bat文件中
  4. 修改这些命令:启用调试符号 (/Zi),禁用优化 (/Od) 等等。

把 /Ox 改成 /Od
在编译器标志中添加 /Zi
在链接器标志中添加 /DEBUG

  1. 现在手动构建你的扩展,而不是使用python的distutils

待办事项:把这些改动整合进Python的distutils中:为Visual Studio工具链添加一个“--build --relWithDebInfo”标志

1

这是设置环境的方法,这样你就可以同时使用调试版和发布版的构建:

在你的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

撰写回答