майя + pyqt. как найти файлы *.ui и значки в них в pyqt?

Я использую Maya2014 + PyQt4. Все мои скрипты хранятся на сервере. У меня есть пути:

## a place where all are read python scripts:
PYTHONPATH=X:\tools\Maya\windows\2014\python\
## a place for *.ui files:
# X:\tools\Maya\windows\2014\python\ui\
## a place for *.ico and *.png files:
XBMLANGPATH=X:\tools\Maya\windows\2014\icons\

Когда я запускаю скрипты из Maya Python, проблем нет. Но для загрузки файлов *.ui я должен указать полный путь:

form, base = uic.loadUiType('X:/tools/Maya/windows/2014/python/UI/lightSets.ui')

Как я могу автоматически загружать файлы *.ui без указания полного пути? У меня много системных переменных и я хочу искать пути в этой файловой системе. Например, когда я работаю на python без Maya, просто укажите let 'ui/aaa.ui', и файл будет найден, поскольку начальная точка пути находится в сценарии запуска python и из подпапок и файлов. уже.

Вторая проблема с файлами *.ui. QtDesigner при сохранении создает такой образ для всех картинок:

<property name="icon">
  <iconset>
    <normaloff>../../icons/close_btn.png</normaloff>
    ../../icons/close_btn.png
  </iconset>
</property>

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

Теперь мне приходится указывать полный путь ко всем образам, что затрудняет изменение путей и перенос скриптов. В общем, прямой путь ко всем иконкам и ресурсам, это плохой путь. Подскажите, как использовать относительные пути в python maya?

Например, я хочу использовать этот базовый путь:

X:/tools/Maya/windows/2014/python/

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


person MaxKu    schedule 08.05.2015    source источник
comment
я исправляю это... получаю путь, например: path = os.path.dirname(unicode(os.path.abspath(file))) и меняю рабочий каталог, например: os.chdir(path)   -  person MaxKu    schedule 13.05.2015


Ответы (2)


Если я правильно понял ваш пост, то мой совет:

PYTHONPATH работает для других вещей, таких как импорт модулей, а не для произвольных файлов, передаваемых в виде строк. Я бы оставил переменную PYTHONPATH в покое и установил новую. Затем я бы получил доступ к новой переменной из Python, используя:

import maya.mel
my_path = maya.mel.eval("getenv MY_NEW_PATH") 

И добавьте его к каждому строковому пути, используя os.join:

import os
form, base = uic.loadUiType(os.join(my_path, 'python/UI/lightSets.ui'))
person chris from local group    schedule 09.05.2015
comment
а что если эта переменная содержит не только один путь, а как переменная путь, который через точку с запятой содержит множество путей? Я вас правильно понял, вы предлагаете иметь только свою собственную переменную окружения, а от нее уже отталкиваетесь? мои скрипты хранятся в подпапках и переносятся в другие места - в этом случае одна переменная уже не подходит. Я думаю, что есть способ узнать ту же начальную точку, из которой был запущен скрипт. по крайней мере в питоне это делается автоматически, но почему майя переназначает так куда-то еще я даже не могу понять куда. - person MaxKu; 11.05.2015
comment
os.getenv('PYTHONPATH') # Результат: X:/tools/Maya/windows/2014/python/animation_manager/;X:/tools/SOFT/Pixar/RenderManStudio-18.0-maya2014/scripts;X:/tools/SOFT /Pixar/RenderManStudio-18.0-maya2014/rmantree/bin;X:/tools/Maya/windows/2014/python;;x:/tools/SOFT/Exocortex/Alembic/scripts;C:/Program Files/Pixar/RenderManStudio- 18.0-maya2014/scripts;C:/Program Files/Autodesk/Maya2014/vray/scripts # - person MaxKu; 11.05.2015
comment
Тогда, как предложил @theodox, почему бы вам не реализовать функцию поиска, которая перебирает все возможные пути, пока не найдет совпадение? Как здесь: stackoverflow.com/a/1724723/3492244 - person chris from local group; 11.05.2015

Здесь рекомендуется ознакомиться с os.walk():

items = []
for directory in list_of_dirs:
    for root, _, files in os.walk(directory):
        for f in files:
            if f.endswith(".ui"):
               items.append(uic.load(os.join(root, f)

это даст вам список форм, базовых пар для всех файлов пользовательского интерфейса в любом месте в любом из каталогов в list_of_dirs

person theodox    schedule 09.05.2015
comment
Что делать, если я даже не знаю букву диска, на котором искать папки с элементами? с чего тогда начать? где искать среди 10 подключенных дисков? Думаю нужно решение на основе автоматического поиска, не уточняя где что находится - person MaxKu; 11.05.2015
comment
он найдет файлы *.ui, а как заставить скрипт искать эти значки в *.ui? uic.loadUiType() - загрузить файл и не найти изображения, если они имеют относительные пути, такие как ‹normaloff›../../icons/close_btn.png‹/normaloff› - person MaxKu; 11.05.2015
comment
Вы не хотите использовать walk на случайных дисках: каждый раз, когда это запускается, вы будете троллить огромное количество файлов. Вы, вероятно, захотите поместить список допустимых местоположений поиска в переменные среды, а затем прочитать его в списке. - person theodox; 11.05.2015
comment
Проверка файлов uic — это отдельная работа, я бы написал импортеру, чтобы он безопасно читал те, которые он может, и сообщал об ошибках или предупреждениях по мере их возникновения. Проверка всех этих данных требует, чтобы у вас было очень хорошее представление о том, что должно быть в файлах, и гораздо лучше иметь процесс, в котором вы можете полагаться на хорошие данные и получать хорошее сообщение об ошибке, когда оно плохое. - person theodox; 11.05.2015
comment
я нахожу простой метод: pyPath = os.path.dirname(unicode(os.path.abspath(файл), кодировка)).replace('\\', '/') Этот метод дает мне путь, по которому файл запускается. Это решает только первую проблему - начальный каталог для всех файлов. А как насчет относительных путей к файлам *.ui? Файл читается и доступен для обработки экспозицией. это функция uic.loadUiType(). Если файл содержит относительный путь - это не просто функция изображения, а отображения. как бороться с этой проблемой? как сделать функцию uic.loadUiType() для поиска картинок? - person MaxKu; 13.05.2015