2013-09-03 3 views
-1

Я новичок в python, так как я изучаю это, я не могу выполнить эту программу, потому что майя падает. Я не знаю, что делать дальше. Каждый раз, когда я выполняю этот скрипт python в редакторе скриптов, я должен выйти из Maya и перезапустить его, потому что программа не ответит. код я использую:Maya crash в скрипте Python

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

Любая помощь?

ответ

0

Ваш цикл while - вот что убивает вас здесь. 1 всегда 1, поэтому он будет работать непрерывно и рухнет майя. Если вы хотите сделать 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() 
1

этого времени цикл не имеет выхода, так что вы будете застряли в прослушивания и-процесс режима навсегда. Кроме того, ваш вызов socket.recv блокируется, поэтому вы не сможете вообще взаимодействовать с майей, пока этот скрипт запущен - скрипт будет захватывать основной поток пользовательского интерфейса (где работает mel/python) и никогда не отпускать его.

Если вы хотите запустить внешний протокол связи, вам нужно будет узнать, как майя обрабатывает потоки python (документы here). Если вы не привязаны к внешнему протоколу связи, вам может быть повезло с использованием родного файла Maya commandPort, который не делает ничего особенного, кроме прослушивания сценариев tcp и триггеров, но по крайней мере означает, что вам не нужно создавать свои собственные с клиентом внутри майя. Другим хорошим выбором для удаленного клиента являются RPYC и ZeroMQ, оба из которых помогут вам создать клиента, не написав его самостоятельно.

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() 
Смежные вопросы