2013-05-23 4 views
0

Итак, я работаю над тем, чтобы мы вытаскивали инструменты/плагины для команды в целом. На самом деле у меня работает система, и она полностью динамична, за исключением темы, о которой я собираюсь поговорить (все это делается на python). При запуске Maya проверяет локальную папку на папке на сервере и проверяет, отличаются ли они, обрабатывает и копирует файлы или файлы, которые необходимы, а также удаляет старые плагины, которые мы удаляем на сервере. Система достаточно гибкая, чтобы пользователи могли создавать пользовательские полки всех плагинов, и мы можем организовать папки в задней части, не нарушая полки всех пользователей. Доступ к плагинам осуществляется через раскрывающееся меню в главном интерфейсе Maya, и мы можем свободно добавлять в систему подпапки и плагины без использования кода. Мы также можем организовать порядок, при котором пункты меню и плагины могут отображаться через простую систему нумерации папок.Импорт модулей/скриптов в python

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

так Если стандарт для импорта класса соответствующего модуля

from fileName import className 

и __import__ пути, который я использую как выглядит.

className = __import__("folderN.folderN.folderN.fileName", {}, {}, ["className"]) 

Но с этим методом я теряю возможность просто вызвать это имя класса, как я могу, с помощью регулярного метода импорта. Я получил вокруг этого, делая

className = className.className 

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

Я просто иду об этом процессе импорта неправильно? Есть ли способ заставить его заглянуть в локальный каталог для плагина, не добавляя пути Maya таким образом, я могу просто сделать обычный способ импорта метода без странного пути, который должен измениться в любое время, когда я перемещаю плагин?

ответ

0

__import__ не работает так, как вы предполагаете. Он возвращает объект модуля для предоставленного пути импорта с гарантией, что все дочерние элементы, указанные вами в списке, были явно импортированы. Для классов это действительно не имеет значения.

mod = __import__('a.b', {}, {}, ['c', 'd']) 

более точно эквивалент

import a.b 
try: 
    import a.b.c 
except ImportError: 
    pass 
try: 
    import a.b.d 
except ImportError: 
    pass 
mod = a.b 

То, что вы на самом деле, вероятно, здесь нужно что-то вроде

child = getattr(__import__(import_path, {}, {}, [child_name]), child_name) 

Что касается вашего контроля версий и системы распределения, вы смотрели на используя SCM/VCS, например SVN или GIT, и/или систему управления пакетами? Это дает вам гораздо лучшее отслеживание изменений и синхронизацию, чем прямой файл, и вы можете легко интегрировать их с скриптом sync/install на своих клиентских машинах, которые могут быть настроены по мере необходимости для конкретных требований к конфигурации клиента.

+0

Wow thanks!работал как шарм, но что делать, если вы делаете импорт как выражение вместо импорта? Прямо сейчас мне все еще нужно сделать этот уродливый блок кода, где я делаю className = className.className, чтобы иметь возможность вызвать его в коде .... – jredd

+0

'import x as y' просто присваивает результат импортируйте операцию в метку 'y' в пространстве имен импорта. Если вам нужно поддерживать динамическое присвоение ярлыков в пространстве имён импорта, вы можете посмотреть обновление 'globals()' или 'locals()', но на самом деле вам, вероятно, стоит взглянуть на реорганизацию базы кода, чтобы лучше поддерживать ваши потребности в развертывании попытки взломать вашу систему импорта для поддержки динамических путей импорта. –