【问题标题】:Maya crash in Python scriptPython 脚本中的 Maya 崩溃
【发布时间】:2013-09-03 15:35:33
【问题描述】:

我是 python 新手,所以当我探索这个时,我无法执行这个程序,因为 Maya 崩溃了。我不知道该怎么做更多。每次我在脚本编辑器中执行这个 python 脚本时,我都必须退出 Maya 并重新启动它,因为 de 程序不会响应。 我使用的代码是:

import socket

import maya.cmds as cmds

UDP_IP="localhost"

UDP_PORT=6001

sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )

sock.bind((UDP_IP, UDP_PORT))

while 1:

    data= sock.recv(1024)
    print (data)
    dataSplit=data.split(';')
    print (dataSplit)

    myList=[]
    for i in range (0, len(dataSplit)):
        myList.append(int(dataSplit[i]))
    print(myList)

    cmds.setAttr('ik_root.moveX',myList[0])
    cmds.setAttr('ik_root.moveY',myList[1])
    cmds.setAttr('ik_root.moveZ',myList[2])


    cmds.refresh()

有什么帮助吗?

【问题讨论】:

    标签: python sockets crash maya


    【解决方案1】:

    简而言之,您有一个无限循环,while 1: 将始终为 1,要解决此问题,只需删除 while 循环,如果您确实有需要执行这些任务的条件,请确保您在循环中更新它,例如

    import socket
    
    import maya.cmds as cmds
    
    UDP_IP="localhost"
    
    UDP_PORT=6001
    
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    
    sock.bind((UDP_IP, UDP_PORT))
    apples = 0
    
    while apples = 1:
    
        data= sock.recv(1024)
        print (data)
        dataSplit=data.split(';')
        print (dataSplit)
    
        myList=[]
        for i in range (0, len(dataSplit)):
            myList.append(int(dataSplit[i]))
        print(myList)
    
        cmds.setAttr('ik_root.moveX',myList[0])
        cmds.setAttr('ik_root.moveY',myList[1])
        cmds.setAttr('ik_root.moveZ',myList[2])
    
        apples = 0
    
    
    
        cmds.refresh()
    

    【讨论】:

      【解决方案2】:

      while 循环没有退出,因此您将永远陷入侦听和处理模式。此外,您对 socket.recv 的调用是阻塞的,因此在此脚本运行时您将根本无法与 Maya 交互 - 该脚本将抓取主 UI 线程(运行 mel/python 的地方)并且永远不会放手。

      如果您想运行外部通信协议,您必须了解 maya 如何处理 python 线程(文档here)。如果您没有绑定到外部通信协议,那么使用 maya 的原生 commandPort 可能会更好 - 除了侦听 tcp 和触发脚本之外,它没有做任何特别的事情,但至少意味着您不需要创建您自己在 Maya 中的线程客户端。远程客户端的其他不错的选择是RPYCZeroMQ,它们都可以帮助您创建客户端而无需自己编写。

      【讨论】:

        【解决方案3】:

        你的while 循环是在这里杀死你的原因。 1 始终为 1,因此它将连续运行并导致 Maya 崩溃。如果您想创建 generator 以返回 data,请执行以下操作:

        def dataGen():
            while 1:
        
            data= sock.recv(1024)
            print (data)
            dataSplit=data.split(';')
            yield (dataSplit)
        
            myList=[]
            for i in range (0, len(dataSplit)):
                myList.append(int(dataSplit[i]))
            yield (myList)
        
            cmds.setAttr('ik_root.moveX',myList[0])
            cmds.setAttr('ik_root.moveY',myList[1])
            cmds.setAttr('ik_root.moveZ',myList[2])
        
        
            cmds.refresh()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多