在没有Python导入的情况下查找模块的路径

时间:2011-01-14 16:51:29

标签: python

我已经看到了几种通过首先导入模块来查找模块路径的方法。有没有办法在不导入模块的情况下执行此操作?

3 个答案:

答案 0 :(得分:56)

使用pkgutil模块:

>>> import pkgutil
>>> package = pkgutil.get_loader("pip")
>>> package.filename
'/usr/local/lib/python2.6/dist-packages/pip-0.7.1-py2.6.egg/pip'
>>> package = pkgutil.get_loader("threading")
>>> package.filename
'/usr/lib/python2.6/threading.py'
>>> package = pkgutil.get_loader("sqlalchemy.orm")
>>> package.filename
'/usr/lib/pymodules/python2.6/sqlalchemy/orm'

使用imp模块:

>>> import imp
>>> imp.find_module('sqlalchemy')
(None, '/usr/lib/pymodules/python2.6/sqlalchemy', ('', '', 5))
>>> imp.find_module('pip')
(None, '/usr/local/lib/python2.6/dist-packages/pip-0.7.1-py2.6.egg/pip', ('', '', 5))
>>> imp.find_module('threading')
(<open file '/usr/lib/python2.6/threading.py', mode 'U' at 0x7fb708573db0>, '/usr/lib/python2.6/threading.py', ('.py', 'U', 1))

N.B:使用imp模块,您无法执行imp.find_module('sqlalchmy.orm')

之类的操作

答案 1 :(得分:3)

对于python3 imp已弃用。使用pkgutil(如上所示)或Python 3.4+使用importlib.util.find_spec

>>> import importlib
>>> spec = importlib.util.find_spec("threading")
>>> spec.origin
'/usr/lib64/python3.6/threading.py'

答案 2 :(得分:1)

您可能想尝试在解释器中运行它:

>>> import sys
>>> sys.modules['codecs'].__file__ # codecs is just an example
'/usr/lib/python2.7/codecs.pyc'