Ошибка типа, создание каталога с помощью Python в Maya

#python #typeerror #maya

#python #ошибка типа #maya

Вопрос:

Я пытаюсь создать папку для сохранения файла с помощью Python в Maya. Однако я получаю сообщение об ошибке, которое я не уверен, как решить. (пока не очень разбираюсь в написании сценариев)

Это код, который создает строку каталога: (Maya правильно распечатывает КАТАЛОГ)

 # Creates a directory to save the .json file to
USERAPPDIR = cmds.internalVar(userAppDir = True)
DIRECTORY = os.path.join(USERAPPDIR, "gradingManager")
print('Maya application directory: ', DIRECTORY)
 

Функция, которая создает каталог, управляется кнопкой в Maya:

     ##########################
    # Safe data in json file #
    ##########################
    cmds.text(label = "")
    cmds.text(label = " Save all results to a .json file for record keeping.",
              font = "boldLabelFont")
    cmds.button(label = "Save to .json file", command = self.save, width = 600)
 

Фактические функции:

 def save(self, directory=DIRECTORY, *args):
    ######################################################################
    ## This method saves the information gathered above in a .json file ##
    ######################################################################

    # creates a directory
    self.createDir(directory)

    print("saving things")

def createDir(self, directory=DIRECTORY):
    ###################################################################
    ## This function creates a directory for the save functionality. ##
    ###################################################################

    if not os.path.exists(directory):
        os.mkdir(directory)
 

Ошибка и функция, на которые она ссылается:

 # Error: TypeError: file C:Program FilesAutodeskMaya2020binpython27.zipgenericpath.py line 26: coercing to Unicode: need string or buffer, bool found #

# Does a path exist?
# This is false for dangling symbolic links on systems that support them.
def exists(path):
    """Test whether a path exists.  Returns False for broken symbolic links"""
    try:
        os.stat(path)
    except os.error:
        return False
    return True
 

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

Комментарии:

1. alwys поместил полное сообщение об ошибке (начинающееся со слова «Traceback») в вопрос (не комментарий) в виде текста (не скриншота). Есть и другая полезная информация.

2. если ПОЛНОЕ сообщение об ошибке показывает вам, в какой строке проблема, вы можете использовать print() и print(type()) для проверки значений в переменных. Кажется, вы вводите неправильное значение directory при выполнении os.path.exists(directory) . Кажется, у вас есть значение True/False вместо expectec path . Вы запускаете это, в save() котором назначено button button(..., command=self.save) — но я не уверен, что button оно будет выполнено с ожидаемым path . Он может выполнить его с совершенно разными значениями (т. Е. С информацией о событии) или save(True) и у вас будет createDir(True) и exists(True)

3. Спасибо за ваш ответ! Насколько я вижу, это полная строка ошибки, которую я получаю. Это указывает на то, что ошибка находится в строке 26 из документа, который установлен с Maya / собственным файлом Maya (не уверен, так ли вы это говорите ..) Строка 26 в этом файле — «os.stat (path)», но я включил всю функцию целиком. (итак, это не моя собственная функция, а от Maya self)

4. Кнопка запускает правильную функцию… когда я говорю функции просто напечатать что-то, она делает это, когда я нажимаю кнопку… это то, что вы имеете в виду? наконец… в нем говорится, что у меня где-то есть bool вместо строки … но если я наведу курсор мыши на слово «каталог», это указывает на то, что на самом деле это строка…

5. вы проверили print(directory) функцию save ? Когда вы нажимаете кнопку, она может запускать ее как save(True) , но вы ожидаете save(some_path) , или save() со значением по умолчанию DIRECTORY — и это может создать вашу проблему.

Ответ №1:

Когда вы нажимаете кнопку, вы ожидаете, что она будет запущена save(some_path) или save() со значением по умолчанию DIRECTORY , но это не работает таким образом.

Кнопка выполняет функцию с некоторыми значениями, предопределенными авторами Maya. Я не знаю, на какие значения отправляется кнопка в Maya save() , но в других графических интерфейсах обычно она отправляет информацию о событиях — ie. какой виджет был нажат, какая кнопка мыши использовалась, какова была позиция мыши и т. Д.

Итак, кажется, что кнопка выполняется save(True) или, может быть, даже save(True, other values) и присваивается True словарю в вашем def save(self, dictionary, ...) , а затем выполняется createDir(True) and exists(True), и вы получаете сообщение об ошибке.

Вы должны использовать DIRECTORY непосредственно внутри функции.

 def save(self, *args):

    directory = DIRECTORY

    # creates a directory
    self.createDir(directory)

    print("saving things")
 

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

 def save(self, *args):

    directory = some_widget_to_select_folder.get_selected_folder()
   
    if not directory:
        directory = DIRECTORY

    # creates a directory
    self.createDir(directory)

    print("saving things")