importlib.util.find_spec

ел несколько подходов для нахождения пути к модулю, сначала импортируя его. Есть ли способ сделать это без импорта модуля?

 jeffcook215014 янв. 2011 г., 18:00
Потому что импорт бесполезен в той точке программы, где нужны пути, и может вызвать циклические зависимости и другие проблемы. Импорт происходит в более подходящее время спустя.
 Leo C Han27 февр. 2017 г., 21:45
Также вы можете просто посмотреть на исходный код, не запуская код в модуле.
 user22531214 янв. 2011 г., 17:53
Почему? Почему вы не хотите импортировать это?

Ответы на вопрос(3)

Вы можете попробовать запустить это в вашем интерпретаторе:

>>> import sys
>>> sys.modules['codecs'].__file__ # codecs is just an example
'/usr/lib/python2.7/codecs.pyc'
 mouad14 янв. 2011 г., 17:59
это не будет работать для пакета, который еще не был загружен.
 jeffcook215014 янв. 2011 г., 17:59
Это не работает, за исключением некоторых модулей из stdlib. Попробуйте это с помощью SQLAlchemy. Спасибо за ответ, хотя.
 virhilo14 янв. 2011 г., 18:01
мой плохой, работает только на импортных модулях
 user39576014 янв. 2011 г., 18:03
-1 потому что (как уже отмечалось) это на самом деле не работает.
 inspectorG4dget14 янв. 2011 г., 17:58
+1 Я бы предложил DFS или что-то с помощью os.system. Но это потрясающе - не знал, что это можно сделать
Решение Вопроса

С помощью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'

С помощьючертенок модуль:

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

 Oddthinking25 окт. 2016 г., 04:30
Я обнаружил [в Python 3.5.1], что package.filename не существует, но package.get_filename () сделал.
 Prody14 июл. 2012 г., 20:46
@mouad Я на самом деле ищу то же самое. Вышеуказанная реализация сpkgutil не делает то, что запрашивается во всех случаях.pkgutil.get_laoder("sqlalchemy.orm") выполнимsqlalchemy/__init__.py, хотя он не будет исполнятьсяsqlalchemy/orm.py.
 mouad15 июл. 2012 г., 00:33
@Prody: Да, это верно в случае пакета, он будет выполнять__init__.py пакет как документация (docs.python.org/release/3.1.5/library/...) сказатьЕсли указанный модуль еще не импортирован, импортируется содержащий его пакет (если есть), чтобы установить пакет_дорожка_ которые имеют смысл :)
 mouad14 янв. 2011 г., 19:46
@cgohlke: на самом деле их нетpkutil пакет, это должно бытьpkgutil, это была опечатка, спасибо за указание на это :)

Для 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'

Ваш ответ на вопрос