如何在python中知道CPython可执行文件是否是调试版本?

时间:2014-04-29 12:22:56

标签: python cpython

我们需要查看我们的代码是否在以编程方式启用调试的CPython可执行文件下运行。 sys模块似乎没有任何信息,至少在Ubuntu 14.04的python3.4-dbg上。 sys.flags.debug设置为0.原因是我们的代码未修改实际上崩溃了python的调试版本。 更新:特别是代码在C端崩溃并出现断言错误。

肯定比'd' in sys.executable更好。

1 个答案:

答案 0 :(得分:9)

以下代码可能就是你所追求的

使用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_DEBUGNDEBUG没有影响 - 可能会也可能不会定义。如果定义了NDEBUG,则断言将被定义为void宏。

来自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'