2012-07-28 167 views
18

對於我的應用程序中的詳細調試消息,我正在使用返回有用前綴的函數。請看下面的例子:Python - 獲取完整包模塊名稱

import inspect 

def get_verbose_prefix(): 
    """Returns an informative prefix for verbose debug output messages""" 
    s = inspect.stack() 
    module_name = inspect.getmodulename(s[1][1]) 
    func_name = s[1][3] 

    return '%s->%s' % (module_name, func_name) 

def awesome_function_name(): 
    print "%s: Doing some awesome stuff right here" % get_verbose_prefix() 

if __name__ == '__main__': 
    awesome_function_name() 

此輸出:

test->awesome_function_name: Doing some awesome stuff right here

我的問題是:當我有一個模塊中的組件,例如 'myproject.utilities.input',從get_verbose_prefix返回的模塊名稱仍然是「輸入」,而不是「myproject.utilities.input」。這大大減少了大型項目中前綴的有用性,因爲在不同的子模塊中可以有幾個「輸入」模塊一起工作。

所以我的問題是:是否有一種簡單的方法在Python的包中檢索完整模塊名稱?我計劃擴展get_verbose_prefix函數以檢查模塊父目錄中的'__init__.py'文件,以推斷它的全名,但首先我想知道是否有更簡單的方法來完成它。

回答

27

__name__始終包含模塊的全名。 (除了__main__上主力,當然)。

+1

我想這是真的,但我如何才能從實際的模塊我的前綴函數的上下文? – Hubro 2012-07-28 22:25:04

+8

沒關係,我想明白了:'inspect.getmodule(s [1] [0]).__ name__'。你也應該編輯'__name__'實際上並不總是返回模塊的全名,因爲它在執行的模塊上返回'__main__' – Hubro 2012-07-28 22:33:07

+0

inspect.getmodule(s [1] [0])中的''' ).__ name__'? – 2017-06-22 05:27:19

6

嘗試使用模塊的__name__屬性。

2

在其包裝內取出完整的模塊名稱的簡單方法:

print(__file__)