2010-03-10 39 views
10
from pack.mod import f 

如何從對象獲得F資料有關進口 - 'pack.mod'獲取功能導入路徑

我可以用得到f.__module__ 但如果模塊在那裏我得到這個屬性(f.__module__)函數DEF它返回'__main__'。但我在這裏需要真正的路徑 - 'pack.mod'

我發現這種方式來獲得這樣的信息:

inspect.getmodule(f).__file__ 

然後我可以分從sys.path啓動路徑,在.更換/並獲得類似路徑 - 'pack.mod' 但可能存在一些更方便的方法嗎?

+2

你爲什麼需要這個開始? – SilentGhost 2010-03-10 18:25:51

回答

12

什麼inspect.getmodule(f)內部確實,每inspect.py's sources,基本上是sys.modules.get(object.__module__) - 我不會把使用代碼直接「更方便」,雖然(超越「本質」的一部分,inspect有捕了很多有用的和修正角落案件)。

爲什麼不直接打電話inspect.getsourcefile(f)

編輯:看來OP試圖做類似

python /foo/bar/baz/bla.py 

和字裏行間中bla.py(其因此被運行爲__main__)確定「什麼fromimport語句可以一不同的主腳本使用從我內部導入這個函數?「。

問題是,問題是病態的,因爲可能沒有任何這樣的路徑可以使用爲目的(無保證,目前主要腳本的路徑是sys.path時,不同的主腳本被以後運行),有可能有幾個不同的人(比如他們/foo/bar/foo/bar/baz可能在sys.path/foo/bar/baz/__init__.py存在,在這種情況下from baz.bla import ffrom bla import f可能都工作),並沒有什麼保證了一些其他,以前sys.path項目可能沒有「搶佔」的進口企圖(例如,說/foo/bar/baz是在sys.path,但在我之前還有/fee/fie/foo,還有一個完全不相關的文件/fee/fie/foo/bla.py也存在 - etc等)。

無論這種發現嘗試的目的,我建議找一個替代架構 - 例如,一個地方from baz.bla import f實際執行(作爲OP說,在這個問題的開始),使f.__module__是正確的設置爲baz.bla

+0

好的,但我需要一些原生的方式來獲取信息格式準備導入,而不是文件路徑女巫我需要解析提取信息。它存在或我必須解析路徑嗎? – evg 2010-03-10 18:54:49

+1

'__module__'屬性爲您提供了該路徑 - 您聲稱它提供了'__main__',但是當您完成後,您將不會再發生這種情況,正如您還說的,從path.mod import f' - 只有當您'重新運行該文件作爲主腳本而不是導入它,而'from'語句意味着你**正在導入,所以'__module__'工作正常。 – 2010-03-10 19:20:36

+0

我的目標是寫記錄器。我把它作爲裝飾器掛在函數上。它轉儲所有函數參數在db調用,函數名稱和模塊名稱也寫 - 我需要這個信息來恢復函數調用稍後與此參數需求。爲了恢復呼叫,我需要加載函數之前,以及爲什麼我需要加載它的路徑...我的目標是sys.path始終相同。 Mb我需要一些另外的方法來確定如何加載函數,m.b完整的文件路徑和函數名稱更好......但在這種情況下,我需要分析文件路徑和sys.path來構建有效的導入路徑......是不是? – evg 2010-03-10 20:09:37

2

你想從__module____name__屬性:

In [16]: import inspect 
In [17]: inspect.getmodule(MyObject).__name__ 
Out[17]: 'lib.objects.MyObject'