Как запустить процедуру, если модуль успешно импортирован в Maya

Я просто заканчиваю сценарий, который можно запустить как модуль. У меня был вызов процедуры в исходном скрипте, поэтому он запускался при импорте, открывая мой графический интерфейс.

Скажем, я хочу открыть это окно, если модуль импортируется правильно. Как мне это сделать?

i.e 
try:
 import maya.cmds as cmds
except:
   pass

#процедура определена здесь

if __name__ == '__main__':
    createGUI()

Когда я импортирую свой скрипт как модуль в Maya, мой графический интерфейс не открывается, что я делаю неправильно? Спасибо

Однако, если я использую pydoc для создания документации и предыдущего формата, он выводится правильно. Но если я вызову какую-либо процедуру вне оператора if, она вызовет ее.
Сегодня я загружу свой код позже.


person Emma Rouse    schedule 24.04.2013    source источник


Ответы (2)


Попробуйте распечатать переменную __name__ в вашем модуле. Когда вы импортируете это в Maya, это может быть частью другого модуля, поэтому это не будет '__main__'. Также это работает:

import myModule 
myModule.createGUI()
person scroll_lock    schedule 24.04.2013
comment
да, это работает ^ но мне нужно, чтобы графический интерфейс открывался автоматически - person Emma Rouse; 24.04.2013
comment
Когда вы печатаете __name__, вы получаете '__main__' или вместо этого получаете имя своего модуля? Я почти уверен, что это не будет '__main__' - person scroll_lock; 24.04.2013
comment
если я печатаю имя в редакторе скриптов, я получаю 'main'... Я совсем запутался. В моем отдельном файле Python графический интерфейс открывается, если я просто вызываю createGUI внизу. Однако при попытке pydoc он говорит, что cmds не определен в попытке и не записывает документацию в html-файл. - person Emma Rouse; 24.04.2013
comment
Я имел в виду размещение оператора печати в вашем модуле print __name__ . Когда вы импортируете модуль или перезагружаете его, он должен печатать имя модуля, но, поскольку вы запускаете его из Maya, оно не должно быть '__main__' - person scroll_lock; 24.04.2013
comment
он печатает имя моего модуля. Значит ли это, что мне нужно писать? если name == 'MyModule' и т. д. createGUI - person Emma Rouse; 24.04.2013
comment
Итак, теперь графический интерфейс открывается в Maya. Но мой pydoc теперь не выводится. - person Emma Rouse; 24.04.2013
comment
Есть ли способ сделать оба? - person Emma Rouse; 24.04.2013
comment
Я не уверен, о каком pydoc вы говорите. Можете включить лучший фрагмент кода. Я думаю, вам следует отредактировать свой первоначальный вопрос, чтобы уточнить это, чтобы мы не комментировали здесь снова и снова. - person scroll_lock; 24.04.2013

if name == main — это стандартная идиома для «если я работаю в интерпретаторе как сценарий». Но все операторы, находящиеся в модуле, будут выполняться во время импорта. Если вы хотите запускать код всякий раз, когда модуль импортируется, просто поместите исполняемый код в конец скрипта (чтобы все имена были определены перед вызовом), и он будет выполняться в обоих местах.

Тем не менее: не делайте. Вы действительно не хотите писать код, который запускается при импорте, кроме тривиальной инициализации и настройки модуля. Гораздо лучше просто написать так:

def create_my_gui():
   # do stuff

if name == "__main__":
   create_my_gui()

а затем вызовите модуль из любого кода, импортированного в Maya:

import myModule
myModule.create_my_gui()

Таким образом, вы можете решить, когда появится графический интерфейс, а не каждый раз, когда вы открываете модуль. В противном случае вы не сможете заглянуть в модуль, чтобы получить функцию или класс, не вызывая запуска графического интерфейса.

person theodox    schedule 13.06.2013