-1

我是 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()

有什么帮助吗?

4

3 回答 3

2

简而言之,您有一个无限循环,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()
于 2013-09-04T05:53:38.417 回答
1

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

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

于 2013-09-03T17:24:52.913 回答
0

您的while循环是在这里杀死您的原因。1 始终为 1,因此它将连续运行并导致 Maya 崩溃。如果您想让生成器返回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()
于 2013-09-03T16:57:55.747 回答