2011-01-14 8 views
28

Ich habe, indem man zuerst den Import es für die Suche nach dem Pfad eines Moduls mehrere Ansätze gesehen. Gibt es eine Möglichkeit, dies zu tun, ohne das Modul zu importieren?Finden Pfad des Moduls ohne in Python importieren

+0

Warum? Warum willst du es nicht importieren? – user225312

+4

Da der Import an dem Punkt im Programm, an dem die Pfade benötigt werden, nutzlos ist, kann dies zu zirkulären Abhängigkeiten und anderen Problemen führen. Der Import erfolgt später zu einem günstigeren Zeitpunkt. – jeffcook2150

+0

Auch möchten Sie vielleicht nur den Quellcode betrachten, ohne Code im Modul auszuführen. –

Antwort

48

pkgutil Modul verwenden:

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

Mit imp Modul:

>>> 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: mit imp Modul Sie kann nicht etwas tun, wie imp.find_module('sqlalchmy.orm')

+0

Dieser arbeitete für mich, danke. – jeffcook2150

+0

@cookiecaper: glücklich es helfen :) – mouad

+0

@cgohlke: eigentlich ist ihr kein __pkutil__ Paket, es sollte __pkgutil__ sein, es war ein Tippfehler, danke für das Aufzeigen :) – mouad

2

Vielleicht möchten Sie laufen diese in Ihrem Dolmetscher versuchen:

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

+1 Ich hätte ein DFS oder etwas vorgeschlagen, das os.system verwendet. Aber das ist genial - wusste nicht, dass das getan werden könnte – inspectorG4dget

+0

Dies funktioniert nicht, außer mit einigen Modulen von der STDLIB. Versuchen Sie es mit SQLAlchemy. Danke für die Antwort. – jeffcook2150

+8

Dies funktioniert nicht für Pakete, die nicht bereits geladen wurden. – mouad

Verwandte Themen