2015-07-05 1 views
0

У меня возникла проблема (я считаю) получить модуль для перезагрузки после того, как он впервые запущен в Maya 2015 на OSX 10.10. Он работает после перезапуска приложения, но мне нужно его обновлять каждый раз, когда скрипт выполняется. Вот код:Как получить python для перезагрузки этого модуля в Maya 2015? Конструктор работает только в первый раз

import os 

try: 
    riggingToolRoot = os.environ["RIGGING_TOOL_ROOT"] 
except: 
    print "RIGGING_TOOL_ROOT environment variable not correctly configured" 
else: 
    import sys 
    print riggingToolRoot 
    path = riggingToolRoot + "/Modules" 

    if not path in sys.path: 
     sys.path.append(path) 

     import System.blueprint_UI as blueprint_UI 
     reload(blueprint_UI) 

     UI = blueprint_UI.Blueprint_UI() 

В конструкторе Blueprint_UI существует в настоящее время только оператор печати, и это работает только первый раз, когда скрипт запускается после того, как Майя был перезапущен. Кажется, что перезагрузка не работает по какой-то причине? Первый раз выход:

/Users/eric/Documents/Projects/RiggingTool 
We are in the constructor 

С этого момента на каждом выполнении только дает следующее, пока я не бросил Майю и рестарт:

/Users/eric/Documents/Projects/RiggingTool 

Я попытался с помощью:

import sys 
sys.dont_write_bytecode = True 

, чтобы узнать, использует ли он .pyc-файлы, но это не имеет никакого значения. Благодарю.

ответ

1

На первом выполнении кода, переменная path еще не в sys.path так, sys.path получает apprended с path, ваш модуль импортируется и перезагружается, и ваш пользовательский интерфейс выполнен.

На втором исполнении вашей программы, path уже sys.path ваше if условия ложно, и код внутри не выполняется (без перезагрузки, не вызова вашего UI).

Вот возможное решение вашей проблемы:

Примечание: Комментарии, начинающиеся с #1: являются для первого выполнения программы в то время как комментарии, начиная с #2: предназначены для последующего выполнения.

import os 

try: 
    riggingToolRoot = os.environ["RIGGING_TOOL_ROOT"] #I guess this is the beginning of your path where blueprint is located 
except: 
    print "RIGGING_TOOL_ROOT environment variable not correctly configured" 
else: 
    import sys 

    print riggingToolRoot #This will be printed in both cases 
    path = riggingToolRoot + "/Modules" 

    #1: path is not yet in sys.path, condition True 
    #2: we previously addded path to sys.path and it will stay like this until we restart Maya, condition False. path will not be appended to sys.path a second time, this is useless 
    if not path in sys.path: 
     sys.path.append(path) 


    if not "System.blueprint_UI" in sys.modules: 
     #1: We never imported System.blueprint_UI 
     #1: Let's do it 
     #1: Note that blueprint_UI is just a local variable, it is not stored anywhere in sys.modules 
     import System.blueprint_UI as blueprint_UI 
    else: 
     #2: When you import a module, it is located in sys.modules 
     #2: Try printing it, your can see all the modules already imported (Maya has quite a lot) 
     #2: Anyway, the condition is False as the module has been imported previously 
     reload(blueprint_UI) 

    #In both case, the module is imported and updated, we can now run the UI function and print "We are in the constructor" 
    UI = blueprint_UI.Blueprint_UI() 
+0

В общем, вы должны думать о отделять код, который устанавливает свои пути и местоположение модуля от фактического кода выполнения: вы хотите вещи ломаются, когда окружающая среда не настроена правильно, так что вы можете обнаружить неправильно установленные вверх машины и исправить их - иначе вы получите тот же вид прерывистого сбоя, который вы видите здесь. – theodox

+0

Большое спасибо! Это имеет смысл, и я вижу это сейчас. Ваше решение отлично работает. – isticism