1

我一直在为 Blender 编写一个导出脚本,它使用 python 来处理任何插件。由于我的大部分代码库都在 C++ 中,我决定将我的代码包装为一个 python 模块 (pyd),该模块将从导出脚本中导入并传递所有相关位进行转换。

只要我制作发布版本,搅拌机就可以很好地加载模块,我什至可以使用 Visual Studio 进行调试 - 但要解决错误,发布版本不可靠,因此我需要使用模块的调试版本。不幸的是,在这种情况下,模块不会加载。

从 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,因为它因致命错误而导致搅拌机崩溃)返回第一个错误(dll 加载失败)。

所以,我的问题是,在运行 python 的发布版本时,如何加载 python 模块的调试版本?由于python嵌入在搅拌机中,我想避免下载源代码并重建它。

4

2 回答 2

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

于 2012-11-19T15:03:12.300 回答
0

我能够在 Python 扩展中使用本机代码进行调试:混合调试和发布 python 库:但我使用了一些技巧:

  1. 以“带有调试信息的发布模式”构建您的本机库:请参阅https://docs.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

TODO: integrate these changes into Python distutils: add a "--build --relWithDebInfo" flag for visual studio toolchain

于 2020-09-18T23:58:16.090 回答