Я пытаюсь получить точное имя модуля, с которым модуль был импортирован изнутри этого модуля. Что-то вроде этого:Поиск локального имени модуля из этого модуля
def install():
print 'Local module name is %s' % __localModuleName__
И когда я побежал:
import myModule as mm
mm.install()
Это напечатает
Local module name is mm
Сценарий я пытаюсь сделать инсталлирует себя в внешнее приложение Maya. Майя оценивает строку, которую я передаю по запросу в python. Прямо сейчас, я пытаюсь дать майя строку "myModule.run()"
. В этом случае я должен знать точное имя myModule
, когда в первый раз запускается myModule.install()
. __name__
не является достаточно конкретным, если пользователь импортирует модуль с использованием import myModule as otherModule
.
Если есть лучший способ сделать это, что не связано с использованием точного имени модуля, я бы с удовольствием узнал. Как-то преобразование ссылки myModule.run
в строку, которую я мог бы хранить в Maya и позже распаковывать. Я пытался использовать модуль inspect
, чтобы найти эту информацию, но я продолжаю находить ситуации, когда это не работает, и я должен вернуться и поиграть с ним еще немного. Это также кажется грязным. Это то, что я использую прямо сейчас, что не работает, если myModule
вызывается из __main__
.
MODULENAME = None
fr = inspect.currentframe()
try:
while fr and not MODULENAME:
if fr.f_globals:
for name, obj in fr.f_globals.iteritems():
if hasattr(obj, '__file__') and inspect.ismodule(obj) and obj.__file__ == __file__:
MODULENAME = name
fr = fr.f_back
except:
pass
finally:
del fr
Если нет хорошего решения, я планирую удалить выше и сказать пользователям, что мой модуль не может быть импортирован с помощью import myModule as ...
.
Спасибо, это гораздо лучшее решение, чем использование фреймов! – Jordan