2014-04-29 44 views
6

我們需要找出我們的代碼是否在通過編程啓用調試的CPython可執行文件下運行。 sys模塊似乎沒有任何信息,至少在Ubuntu 14.04的python3.4-dbg上。 sys.flags.debug設置爲0.原因是我們的代碼未修改實際上會崩潰python的調試版本。 更新:具體來說,代碼在C端發生斷言錯誤。如何知道CPython可執行文件是否爲python中的調試版本?

當然肯定會有比看看是否更好看'd' in sys.executable。使用python3.4-dbg

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

在另一方面:

回答

9

下面的代碼可能是你在做什麼

使用python3.4

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

然而,也有編譯時間選項控制「調試」行爲,如NDEBUG menti oned here:http://bugs.python.org/issue17411。換句話說:儘管Py_DEBUG可能未被設置(0),但由NDEBUG控制的C代碼聲明仍可能改變python的行爲。設置Py_DEBUG總是會取消設置NDEBUG,導致應用聲明。缺少Py_DEBUGNDEBUG沒有影響 - 它可能會或可能不會被定義。如果定義了NDEBUG,則斷言將被定義爲無效宏。

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

程序員可以僅通過重新編譯 程序,在不改變的源代碼消除斷言:如果宏NDEBUG是加入的,斷言之前定義 ()宏是 簡單地定義爲:

#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' 
+0

哇,不知道。 +1 – vaultah

+1

這就是爲什麼我討厭C斷言的原因之一 - 有人知道事情可能會出錯,但不是處理它,而只是在調試版本中選擇**來進行測試**,事情可能會在可交付成果中下地獄代碼 - *(咆哮,脾放空)!* –

+0

不可移植的是的,但至少這在真實的操作系統上工作,不知道關於sysconfig中的Py_DEBUG和NDEBUG或他們的含義,謝謝。 –

相關問題