如何从 Python C 代码中断言?

发布于 2024-10-09 08:25:36 字数 580 浏览 4 评论 0原文

我正在用 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 操作系统和 Linux。

帮助!

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

I'm writing a Python class in C and I want to put assertions in my debug code. assert.h suits me fine. This only gets put in debug compiles so there's no chance of an assert failure impacting a user of the Python code*.

I'm trying to divide my 'library' code (which should be separate to the code linked against Python) so I can use it from other C code. My Python methods are therefore thinnish wrappers around my pure-C code.

So I can't do this in my 'library' code:

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

because this pollutes my pure-C code with Python. It's also far uglier than a simple

assert(black != white);

I believe that the Distutils compiler always sets NDEBUG, which means I can't use assert.h even in debug builds.

Mac OS and Linux.

Help!

*one argument I've heard against asserting in C code called from Python.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

别在捏我脸啦 2024-10-16 08:25:36

只需使用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

Just use assert.h. It's a myth that distutils always defines NDEBUG; it only does so for Microsoft's msvc on Windows, and then only when invoked from a Python release build (not from a Python debug build).

To then define NDEBUG in your own release builds, pass a -D command line option to setup.py build_ext.

Edit: It seems that NDEBUG is defined by default through Python's Makefile's OPT setting. To reset this, run

OPT="-g -O3" python setup.py build
污味仙女 2024-10-16 08:25:36

在 setup.py 中取消定义 NDEBUG 宏:

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

这将导致像 Which(虽然丑陋)这样的命令行

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

执行正确的操作,即它保持启用断言。

Undefine the NDEBUG macro in your setup.py:

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

This will result in a command line like

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

Which (while ugly) does the correct thing, i.e. it keeps assertions enabled.

瑕疵 2024-10-16 08:25:36

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

Create your own macro, such as myassert() for different situations. Or create a macro, which checks a global variable to see if the macro is used from Python code or "normal" C. The Python module entry point would have to set this variable to true, or you could use function pointers, one for Python code, another default one for C code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文