如何在Python中判断CPython可执行文件是否为调试版本?

7 投票
1 回答
621 浏览
提问于 2025-04-18 04:44

我们需要找出我们的代码是否在一个启用了调试功能的CPython可执行文件下运行,这个过程需要通过程序来实现。sys模块似乎没有提供相关的信息,至少在Ubuntu 14.04的python3.4-dbg版本中是这样。sys.flags.debug的值是0。出现这种情况的原因是我们的代码在不修改的情况下,实际上会导致Python的调试版本崩溃。更新:具体来说,代码在C语言层面上会出现一个断言错误。

当然,检查'd' in sys.executable的方法并不是最好的选择。

1 个回答

10

下面的代码可能正是你需要的

使用 python3.4

>>> import sysconfig
>>> sysconfig.get_config_var('Py_DEBUG')
0

另一方面,使用 python3.4-dbg

>>> import sysconfig
>>> sysconfig.get_config_var('Py_DEBUG')
1

不过,还有一些编译时的选项可以控制“调试”行为,比如这里提到的 NDEBUGhttp://bugs.python.org/issue17411

换句话说:虽然 Py_DEBUG 可能没有被设置(值为0),但是由 NDEBUG 控制的C代码断言仍然可能会改变Python的行为。设置 Py_DEBUG 会始终取消 NDEBUG 的设置,从而使断言生效。而没有 Py_DEBUG 不会影响 NDEBUG 的定义——它可能被定义,也可能不被定义。如果 NDEBUG 被定义,断言将被定义为一个空宏。

来自 http://en.wikipedia.org/wiki/Assert.h

程序员可以通过重新编译程序来消除断言,而不需要改变源代码:如果在包含之前定义了宏 NDEBUG,assert() 宏将被简单地定义为:

#define assert(ignore)((void) 0)

一个可能的,但不太通用的解决方案是检查编译器命令行中的 OPT

>>> '-DNDEBUG' not in (sysconfig.get_config_var('OPT') or '')

其中 OPT 可能是例如:

>>> sysconfig.get_config_var('OPT')
'-DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes'

撰写回答