如何在Python中判断CPython可执行文件是否为调试版本?
我们需要找出我们的代码是否在一个启用了调试功能的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
不过,还有一些编译时的选项可以控制“调试”行为,比如这里提到的 NDEBUG
:http://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'