Maya

コマンドラインから Maya のスクリプトを走らせる

import os
import subprocess

TARGET_DIRECTORY = r'D:\test'
JSON_PATH = r'D:\test\json\result.json'
MAYA_PATH = r'C:\Program Files\Autodesk\Maya2022'

MAYA_PYTHON_PATH = os.path.join(MAYA_PATH, r"bin\mayapy.exe")
PACKAGES_PATH = os.path.join(MAYA_PATH, r"Python\Lib\site-packages")


def run_maya_script(file_path):
    """

    Args:
        file_path (str): ファイルパス

    """

    print('\n\n------------------------------------------------------------------\n\n')
    print('ファイル名 :', file_path)

    script = r"""
import os
import json
import maya.cmds as cmds
import maya.standalone
maya.standalone.initialize(name='python')

FILE_PATH = r'{}'
JSON_PATH = r'{}'

# fbx ファイルを開く場合はプラグインのロードが必要
if not cmds.pluginInfo(r"fbxmaya", query=True, loaded=True):
    cmds.loadPlugin(r"fbxmaya")

# エラーで止まるので小まめに try 文を使用する
try:
    # ファイルを開く
    cmds.file(FILE_PATH, open=True, force=True)
except:
    pass

# シーン内の全てのメッシュノードをリストアップ
mesh_list = cmds.ls(type='mesh')
print(mesh_list)



# json ファイルへ記載
file_name = os.path.splitext(os.path.basename(FILE_PATH))[0]

if os.path.isfile(JSON_PATH):
    with open(JSON_PATH, 'r', encoding='utf-8') as f:
        content = json.load(f)

else:
    content = {{}}

content[file_name]= mesh_list

with open(JSON_PATH, 'w') as f:
    json.dump(content, f, indent=4, ensure_ascii=False)


    """.format(file_path, JSON_PATH)

    # print(process_script)

    # MayaのPythonコマンドラインツールを使用してスクリプトを実行
    # result = subprocess.check_output([MAYA_PYTHON_PATH, "-c", script])

    result = subprocess.run(
            [MAYA_PYTHON_PATH, "-c",
             script],
            capture_output=True,
            text=True,
    )

    print('stdout :', result.stdout)

    print('\nstderr :')
    print(result.stderr)

    # 結果を表示
    print('\n\n結果 :')
    print(result)



def main():

    # PYTHONPATH にパッケージフォルダを追加
    # これ追加しないとエラーになるので注意
    # No module named 'maya.standalone' のエラーがでたらこれが原因

    os.environ["PYTHONPATH"] = PACKAGES_PATH
    item_list = os.listdir(TARGET_DIRECTORY)

    for item in item_list:
        file_path = os.path.join(TARGET_DIRECTORY, item)

        run_maya_script(file_path)



if __name__ == '__main__':
    main()