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

jef*_*150 37 python

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

mou*_*uad 58

使用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'
Run Code Online (Sandbox Code Playgroud)

使用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))
Run Code Online (Sandbox Code Playgroud)

注意:使用imp模块你不能做类似的事情imp.find_module('sqlalchmy.orm')

  • @Prody:是的,在包的情况下,它会执行``__init __.py``包作为文档(http://docs.python.org/release/3.1.5/library/pkgutil.html#pkgutil .get_loader)说**如果指定的模块尚未导入,则导入其包含的包(如果有的话),以便建立包__path __**,这使得总体意义:) (2认同)
  • 我发现[在Python 3.5.1中] package.filename不存在,但是package.get_filename()存在。 (2认同)

Bry*_*nta 9

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

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

  • 不幸的是“find_spec”可能会尝试导入模块https://github.com/python/cpython/blob/ec2385e315fc6b28d92dfb4c97fefcbb1e7daa68/Lib/importlib/util.py#L94 (2认同)