获取导入模块的文件path

我怎样才能得到在Python中导入模块的文件path。 我正在使用Linux(如果重要)。

例如:如果我在我的家目录,并导入一个模块,它应该返回我的主目录的完整path。

模块和包有一个__file__属性,有它的path信息。 如果模块是相对于当前工作目录导入的,则可能需要获取其绝对path。

 import os.path import my_module print os.path.abspath(my_module.__file__) 

我一直在使用这个:

 import inspect import os class DummyClass: pass print os.path.dirname(os.path.abspath(inspect.getsourcefile(DummyClass)) 

(编辑:这是一个“我在哪里”function – 它返回包含当前模块的目录。我不太确定这是你想要的)。

这会给你模块所在的目录:

 import foo os.path.dirname(foo.__file__) 

要find已经加载的模块的加载path:

 >>> import sys >>> sys.modules['os'] <module 'os' from 'c:\Python26\lib\os.pyc'> 

我一直在使用这个方法,它适用于非内置模块和内置模块:

 def showModulePath(module): if (hasattr(module, '__name__') is False): print 'Error: ' + str(module) + ' is not a module object.' return None moduleName = module.__name__ modulePath = None if imp.is_builtin(moduleName): modulePath = sys.modules[moduleName]; else: modulePath = inspect.getsourcefile(module) modulePath = '<module \'' + moduleName + '\' from \'' + modulePath + 'c\'>' print modulePath return modulePath 

例:

 Utils.showModulePath(os) Utils.showModulePath(cPickle) 

结果:

 <module 'os' from 'C:\SciSoft\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\os.pyc'> <module 'cPickle' (built-in)>