【问题标题】:How can I assert from Python C code?如何从 Python C 代码中断言?
【发布时间】:2011-05-31 07:19:49
【问题描述】:

我正在用 C 语言编写一个 Python 类,我想在我的调试代码中添加断言。 assert.h 很适合我。这只会被放入调试编译中,因此断言失败不会影响 Python 代码的用户*。

我正在尝试划分我的“库”代码(它应该与链接到 Python 的代码分开),以便我可以从其他 C 代码中使用它。因此,我的 Python 方法是纯 C 代码的精简包装器。

所以我不能在我的“库”代码中这样做:

if (black == white)
{
    PyErr_SetString(PyExc_RuntimeError, "Remap failed");
}

因为这会用 Python 污染我的纯 C 代码。它也比简单的丑得多

assert(black != white);

我相信 Distutils 编译器总是设置NDEBUG,这意味着即使在调试版本中我也不能使用assert.h

Mac OS 和 Linux。

救命!

*我听说过一个反对在从 Python 调用的 C 代码中断言的论点。

【问题讨论】:

    标签: python c distutils python-c-api python-c-extension


    【解决方案1】:

    针对不同的情况创建自己的宏,例如myassert()。或者创建一个宏,它检查全局变量以查看宏是从 Python 代码还是“普通”C 中使用的。Python 模块入口点必须将此变量设置为 true,或者您可以使用函数指针,一个用于 Python代码,C 代码的另一个默认代码。

    【讨论】:

      【解决方案2】:

      只需使用assert.h。 distutils 总是定义NDEBUG 是一个神话;它仅适用于 Windows 上的 Microsoft msvc,并且仅在从 Python 发布版本(而不是从 Python 调试版本)中调用时才这样做。

      要在您自己的发布版本中定义 NDEBUG,请将 -D 命令行选项传递给 setup.py build_ext。

      编辑:似乎NDEBUG是通过Python的Makefile的OPT设置默认定义的。要重置它,请运行

      OPT="-g -O3" python setup.py build
      

      【讨论】:

      • 这就是我想听到的!所以,当我运行python setup.py buildpython setup.py build --debug 时,我得到类似:gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -arch i386 -arch x86_64 -g -O2 -DNDEBUG -g -O3 -g -UDEBUG -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c thing.c -o build/temp.macosx-10.6-intel-2.7/thing.o。我将如何删除 NDEBUG?
      • 这并不能真正解决问题。如果您想在所有情况下都启用断言,那么告诉所有用户使用自定义构建命令并不是一个好的解决方案。这需要在setup.py 中以某种干净的方式修复。
      • OPT 对我不起作用(Py3,setuptools),但是 CFLAGS 做到了:CFLAGS="-O0 -UNDEBUG" python3 setup.py build_ext -i
      【解决方案3】:

      setup.py 中取消定义 NDEBUG 宏:

      ext_modules = [Extension(
          ...
          undef_macros=['NDEBUG'],
      )]
      

      这将产生一个类似的命令行

      gcc ... -DNDEBUG ... -UNDEBUG ...
      

      哪个(虽然丑陋)做了正确的事情,即它保持启用断言。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 2011-05-12
        • 2023-03-19
        相关资源
        最近更新 更多