2013-08-21 47 views
0

我想寫一個類,會告訴我的當前工作職能的樹,這意味着:的Python:函數調用的內部信息和自動記錄

比方說,我有先函數的函數的調用函數B C,和函數C調用函數D.在時間t = 1,B正在運行,所以想要的標準輸出爲:

Root: function A -> running properly, called B 
2-nd: function B -> running properly 

在時間t = 2,B已經返回到A,所以標準輸出變爲:

Root: function A -> running properly, B returned 

在時間t = 3,A已稱爲C.在時間t = 4,C已稱爲D的標準輸出應爲:

Root: function A -> running properly, B returned, called C 
2-nd: function C -> running properly, called D 
3-rd: function D -> running properly 

在時間t = 5,d返回。在時間t = 6,C返回。該標準輸出應該是:

Root: function A -> running properly, B returned, C returned 

在時間t = 7,功能A返回:

Root: function A -> Done 

除了創造一個記錄器對象和周圍通過它,有沒有自動完成這一更優雅的方式?如果A或B是多線程進程?

任何建議,非常感謝。謝謝!

+2

你看過'inspect'模塊嗎?您可以從那裏獲取堆棧和跟蹤。 –

+0

我以前沒見過。當我讀到它時,它可能是可用的。但我想要一種乾淨的日誌記錄方式。如果我使用檢查,似乎必須調用一組函數才能在每個函數調用之前獲取信息。這將與記錄器對象相同,除了這是內置的和很棒的。 – Mai

回答

1

看看Python中的trace module

跟蹤模塊允許你跟蹤程序的執行,生成註釋語句覆蓋列表,打印來電者:您可以使用此模塊

在Python文檔中的跟蹤模塊的定義生成帶註釋的跟蹤報告/被調用者關係和在程序運行期間執行的列表函數。它可以在另一個程序或命令行中使用。

+0

謝謝您的建議!是否可以通過覆蓋任何函數來修改日誌記錄輸出之前?我在文章中沒有提到,但我希望根據我的需要,輸出是靈活的,這將在稍後成爲第二個問題。 – Mai

+0

@Mai我不完全確定這是否可以完成。有些挖掘並找出本文詳細介紹了trace如何用於代碼覆蓋率分析和跟蹤調用:http://doughellmann.com/2008/10/ pymotw-trace.html。我想,trace命令本身的輸出可以被解析並呈現爲所需的格式? –