При попытке переименовать файл был указан неверный путь - PullRequest
0 голосов
/ 18 октября 2019

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

Я не уверен, как Maya сохранила путь к файлу, но всякий раз, когда я пытался переименовать его, он говорил мне, что «был указан неверный путь». вместе с моим путем к файлу.

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

Кто-нибудь знает, что происходит? Большое спасибо !!!

a = cmds.file (query = True, expandName = True)  #result: D:/DATA/MAYA/myProject/assets/testFolder/test_01.ma
#print a[:-3]
x,y = a[-5:-3]  #result: x = 0, y = 1
x = int(x)      
y = int(y)
if y < 9:
    y += 1      #result: x = 0, y = 2
    #print (y)
elif y == 9:
    y = 0 
    x += 1      
x = str(x)
y = str(y)
b = a.replace(a[-5:-3], x+y)  #replace 01 with 02
#print b
cmds.file (rename = b)  #this is where I got the error. the result should be D:/DATA/MAYA/myProject/assets/testFolder/test_02.ma

Ответы [ 3 ]

3 голосов
/ 21 октября 2019
# Error: RuntimeError: file <maya console> line 1: An invalid path was specified.

Эта ошибка срабатывает при запуске cmds.file(rename=your_path), но каталог указанного пути не существует, что имеет смысл, поскольку не допустимо!

Итаквсе, что вам нужно сделать, это создать папку перед вызовом. Вы можете использовать os.makedirs для этого. Вы не хотите включать имя файла в полный путь, поэтому вы также можете использовать os.path.dirname для его удаления. Таким образом, вместо передачи "/my/full/path/file_name.mb", использование os.path.dirname обрезает его до "/my/full/path".

Поэтому, расширив ответ itypewithmyhands, он будет выглядеть так:

import os

newVersion = getNextVersion()
versionFolder = os.path.dirname(newVersion)
if not os.path.exists(versionFolder):
    os.makedirs(versionFolder)
1 голос
/ 20 октября 2019

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

Обратите внимание, что функция, которая работает с форматом строки для переименования вашей сцены, будет использоватьминимум 2 цифры (01, 02 и т. д.) и максимум 3 цифры (100, 101 и т. д.). Если вы пройдете более 999 итераций, вам нужно будет немного изменить это.

Примечание: Эта методология опирается на подчеркивание перед версией вашего файла (например, _01.mb) вместо вашеготекущий метод индекса строки.

import maya.cmds as cmds

def getNextVersion():
    curName = cmds.file(query=True, expandName=True) # eg. D:/yourScene_01.mb
    curVersionFull = curName.split('_')[-1]          # eg. 01.mb
    versionExtension = curVersionFull.split('.')     # eg. ['01', 'mb']
    curVersionNum = int(versionExtension[0])         # eg. 1
    extension = versionExtension[1]                  # eg. 'mb'

    nextVersionNum = curVersionNum + 1               # increment your version
    if nextVersionNum < 100:
        nextVersionFull = '{:02d}.{}'.format(nextVersionNum, extension) # eg. 02.mb
    else:
        nextVersionFull = '{:03d}.{}'.format(nextVersionNum, extension) # eg. 100.mb

    newName = curName.replace(curVersionFull, nextVersionFull)
    return newName


cmds.file(rename=getNextVersion())
cmds.file(save=True)

Обновление:

Вы уже приняли другой ответ, и я считаю, что суть вашей проблемы в том, что @ green-cellописывает. Что касается того, как это вообще возможно, я на самом деле не знаю. Как правило, Maya не позволяет сохранять файлы в несуществующей папке.

Например:

import maya.cmds as cmds
cmds.file(rename="D:/doesntexist/somefile.mb")
# Error: An invalid path was specified. : D:/doesntexist/
# Traceback (most recent call last):
#   File "<maya console>", line 2, in <module>
# RuntimeError: An invalid path was specified. : D:/doesntexist/ # 

В любом случае, я собрал для вас более тщательную функцию. Обратите внимание, что сложно учесть все возможные шаблоны имен файлов, особенно если пользователям разрешено указывать свои собственные имена файлов в любой части процесса. На этот раз я использую regular expressions, что делает вашу замену намного более надежной (хотя и далеко не безошибочной).

import re
import os
import maya.cmds as cmds

def getNextVersion(createDir=True):
    '''Find next available filename iteration based on current scene name

    Args:
        createDir (bool, optional): True to create the output directory if required. False to leave as-is (may trigger a failure)

    Returns:
        str|None: Full file path with incremented version number. None on failure
    '''

    # Grab current filename. This always returns something. If unsaved, it will return something unsavory, but still a string
    curFile = cmds.file(query=True, expandName=True)
    print('Current filename is {}'.format(curFile))

    # This matches a digit between 1 and 4 numbers in length, followed immediately by a file extension between 2 and 3 characters long
    m = re.match(r'(.+?)(\d{1,4})\.(\w{2,3})', curFile)
    if m == None:
        print('Failed at regex execution. Filename does not match our desired pattern')
        return None

    # Extract regex matches
    basePath = m.group(1)
    version = m.group(2)
    extension = m.group(3)

    # Failsafe. Should not trigger
    if not basePath or not version or not extension:
        print('Failed at failsafe. Filename does not match our desired pattern')
        return None

    # Increment file version
    numDigits = len(version)
    newFile = None
    try:
        version = int(version) + 1

        # Deal with padding
        newLength = len(str(version))
        if newLength > numDigits:
            numDigits = newLength

        # Compile new path
        newFile = '{base}{ver:{numDig:02d}d}.{ext}'.format(base=basePath, ver=version, numDig=numDigits, ext=extension)
    except Exception as e:
        print('Error parsing new version for path {}: {}'.format(curFile, e))
        return None

    # Another failsafe
    if not newFile:
        print('Failed at failsafe. Filename calculations succeeded, but new path is not valid')
        return None

    # Create output dir if needed
    dirname = os.path.dirname(newFile)
    if createDir and not os.path.isdir(dirname):
        try:
            os.makedirs(dirname)
            print('Created all dirs required to build path {}'.format(dirname))
        except Exception as e:
            print('Error creating path {}: {}'.format(dirname, e))
            return None

    return newFile


nextVersion = getNextVersion()
if not nextVersion:
    cmds.error('Error parsing new filename increment. Please see console for more information')
else:
    cmds.file(rename=nextVersion)
    cmds.file(save=True)
0 голосов
/ 21 октября 2019

Обновление # 02:

Я понял, что ошибка произошла только с первой версией. Скажем, если у меня есть первая версия как sceneName_01.ma, и я попытаюсь обновить ее и сохранить, Майя скажет мне, что «указан неверный путь». Но если я переименую его вручную как sceneName_02.ma и перезапущу код снова, код будет работать нормально.

Это не из-за номера версии. После того, как я попытался сохранить свою первую версию как sceneName_00.ma и попробовать скрипт, он все равно выдал мне ту же ошибку. Мне пришлось переименовать его в sceneName_01.ma вручную и перезапустить скрипт, пока он не заработал.

...