2015-11-23 39 views
2

調用模塊的名稱難道還有比這讓調用模塊的名稱更直接的方式:得到在Python

script_file_path = sys.argv[0] 
top_module_name = None 
for frame in reversed(inspect.stack()): 
    if frame[1] == script_file_path: 
     top_module_name = inspect.getmodule(frame[0]).__name__ 
+0

你所說的「調用模塊」的意思? – user2357112

+0

我猜他的意思是'如果a.py導入b.py,並且b.py導入c.py,我會在c.py中輸入哪些代碼來打印「我是由b導入的?」? – Kevin

+0

與用於調用當前python進程的腳本對應的模塊的名稱(例如'__main__',但它並不總是'__main__';例如多處理)。 –

回答

0

我認爲以下兩個條件肯定更高效,並且第一似乎更直截了當(至少,你處理更少的索引,文件路徑等)。我認爲首先將工作的大部分時間(但我還沒有完全測試吧):

import inspect 

def get_invoking_module(): 
    frame = inspect.currentframe() 
    return frame.f_back.f_globals["__name__"] 

這應該工作的所有時間:

def get_invoking_module(): 
    frame = inspect.currentframe() 
    current_module = inspect.getmodule(frame) 
    while inspect.getmodule(frame) == current_module: 
     frame = frame.f_back       # walk back up the frames 
    if frame: 
     return frame.f_globals["__name__"]