关于python:获取导入模块的文件路径

Getting file path of imported module

本问题已经有最佳答案,请猛点这里访问。

如何获取在python中导入的模块的文件路径。我正在使用Linux(如果重要的话)。

如果我在home目录中并导入一个模块,它应该返回home目录的完整路径。


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

1
2
3
4
import os.path
import my_module

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


我一直在用这个:

1
2
3
4
import inspect
import os
class DummyClass: pass
print os.path.dirname(os.path.abspath(inspect.getsourcefile(DummyClass))

(编辑:这是一个"我在哪里"函数-它返回包含当前模块的目录。我不太确定这是不是你想要的。


这将为您提供模块所在的目录:

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

要查找已加载模块的加载路径,请执行以下操作:

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


我可能会迟到,一些模块在使用__file__属性查找路径时会抛出AttributeError。在这种情况下,可以使用__path__获取模块的路径。

1
2
3
>>> import some_module
>>> somemodule.__path__
['/usr/lib64/python2.7/site-packages/somemodule']

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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

例子:

1
2
Utils.showModulePath(os)
Utils.showModulePath(cPickle)

结果:

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


尝试:

help('xxx')

例如

1
2
3
4
5
6
7
8
>>> help(semanage)
Help on module semanage:

NAME
    semanage

FILE
    /usr/lib64/python2.7/site-packages/semanage.py