2011-01-14 21 views
28

He visto varios enfoques para encontrar la ruta de un módulo importándolo primero. ¿Hay alguna forma de hacerlo sin importar el módulo?Buscar la ruta del módulo sin importar en Python

+0

¿Por qué? ¿Por qué no quieres importarlo? – user225312

+4

Porque importar es inútil en el punto en el programa donde se necesitan las rutas y puede causar dependencias circulares y otros problemas. La importación ocurre en un momento más oportuno más adelante. – jeffcook2150

+0

También es posible que desee simplemente mirar el código fuente sin ejecutar realmente ningún código en el módulo. –

Respuesta

48

Usando pkgutil módulo:

>>> 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' 

Usando imp módulo:

>>> 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)) 

NB: con módulo de imp se no puede haga algo como imp.find_module('sqlalchmy.orm')

+0

Este trabajó para mí, gracias. – jeffcook2150

+0

@cookiecaper: contento si ayuda :) – mouad

+0

@cgohlke: en realidad no es un paquete __pkutil__, debería ser __pkgutil__, fue un error tipográfico, gracias por señalarlo :) – mouad

2

Es posible que desee intentar ejecutar esto en su intérprete:

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

+1 Hubiera sugerido un DFS o algo usando el sistema os.system. Pero esto es increíble, no sabía que esto podría hacerse – inspectorG4dget

+0

Esto no funciona, excepto con algunos módulos de stdlib. Pruébalo con SQLAlchemy. Gracias por la respuesta, sin embargo. – jeffcook2150

+8

esto no funcionará para el paquete que no se ha cargado previamente. – mouad

Cuestiones relacionadas