Как найти местоположение пакета Python, установленного через egg-link? - PullRequest
3 голосов
/ 06 декабря 2011

Я работаю над архитектурой плагинов, и мне нужно преобразовать имя пакета, например "foo.bar", в абсолютный путь, в котором находится код.Кажется, что imp.find_module делает то, что я хочу, за исключением случаев, когда рассматриваемый код устанавливается через egg-ссылку (устанавливается через 'pip installvelop').

Если есть два модуля foo.bar и foo.bar2, которые устанавливаются через egg-ссылки (и которые находятся в совершенно разных местах файловой системы, таких как / home / bob / foo / bar и / home / alice / foo / bar2), find_modules не работают, потому что я смотрю пакет "foo "и получить местоположение для foo / bar, но не для foo / bar2.

У кого-нибудь есть предложения по альтернативной функции?find_modules не принимает иерархические имена, поэтому я не могу просто передать в него "foo.bar2".

1 Ответ

5 голосов
/ 06 декабря 2011

Самый простой способ - просто импортировать модуль и проверить его атрибут __file__:

import os
import foo.bar

print(os.path.abspath(foo.bar.__file__))

Для динамического импорта:

import os
import sys

module_name = 'foo.bar'
__import__(module_name)
print(os.path.abspath(sys.modules[module_name].__file__))
...