2011-08-19 55 views
3

我需要知道代碼對象來自哪裏;其模塊。所以我(天真)嘗試:如何找到代碼對象來自哪個文件?

os.path.abspath(code.co_filename) 

但是,這可能會或可能無法正常工作,(我認爲這是因爲ABSPATH取決於CWD)

任何方式來獲得一個代碼對象的模塊的完整路徑

編輯:
檢查模塊的函數:getfile,getsourcefile,getmodule,只獲取文件名,而不是它的路徑(與co_filename相同的東西)。也許他們使用abspath。

+0

你到底在找什麼?你從示例代碼中得到了什麼輸出,以及你期望的是什麼? –

+0

@Shaw Chin:我只得到文件的名稱,我需要它的完整路徑。 – dugres

+0

奇怪。它是什麼樣的代碼對象? –

回答

3
import inspect 
print inspect.getfile(inspect) 
+0

getfile返回co_filename – dugres

1

inspect.getsourcefile()函數就是你所需要的,它會返回找到對象源的文件的相對路徑。

+0

nope,只是文件名 – dugres

+0

inspect.getsourcefile(os.path)返回了'/usr/lib/python2.7/posixpath.py'(看起來返回的路徑是依相關情況而定,相對或絕對)。 – MatToufoutu

+0

是的,這取決於上下文(像abspath),這就是問題所在,我不會依賴它。 – dugres

0

如果您有權訪問該模塊,請嘗試module.__file__

>>> import xml 
>>> xml.__file__ 
'/usr/local/lib/python2.6/dist-packages/PyXML-0.8.4-py2.6-linux-i686.egg/_xmlplus/__init__.pyc' 

如果你不這樣做,這樣的事情應該工作:

>>> import xml.etree.ElementTree as ET 
>>> thing = ET.Element('test') 
>>> __import__(thing.__module__).__file__ 
'/usr/local/lib/python2.6/dist-packages/PyXML-0.8.4-py2.6-linux-i686.egg/_xmlplus/__init__.pyc' 

在這種情況下,我們使用的事實,進口可以被稱爲在模塊的字符串版本,它返回實際的模塊對象,然後在那上調用__file__

相關問題