socket.recv пуст, но результат отображается в Maya - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь получить значения для вращения суставов в Maya во внешнюю IDE. Я успешно смог отправить команды, и Maya отвечает правильно, но у меня возникают проблемы с пониманием того, как получить результаты обратно в IDE.

Я пытался использовать socket.recv и socket.recvmsg, но получил ошибки для обоих.

Код работает в PyCharm

import socket
host = 'localhost'
port = 7720

code1 = ("servo_1 = [cmds.getAttr('joint2.rotateY')]\\n"
         "print servo_1")
try:
   # Connect to Maya Command Port
   maya = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   maya.connect( (host,port) )
   # Send Command Through Socket --> Can Only Send MEL Commands
   message = 'python("{}")'.format(code1)
   print message
   maya.send(message)
   reply = maya.recv(4096)
   print reply
except:
   raise Exception, 'Connection Failed To : %s:%s' % (host, port)

finally:
   #Close Socket Connection
   maya.close()

Код в Maya для открытия команды Port

import maya.cmds as cmds
if not cmds.commandPort(':7720', q=True, echoOutput=True, noreturn=False):
    cmds.commandPort(name=':7720')

Ожидаемый результат равен [43.74], как показано в Maya, но фактический результат в PyCharm

1 Ответ

0 голосов
/ 22 апреля 2019

Я запустил его, настроив соединение клиентского сокета от Maya до PyCharm, сделав сервер сокета Python и настроив Maya в качестве клиента и используя модуль pickle для отправки списка.

Python Server

import socket
import pickle

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(4096)
    if not data: break
    conn.send(data)
    data2 = pickle.loads(data)
    print 'servo_1 = %s' % (data2)
conn.close()

Клиент Maya

import socket, pickle
import maya.cmds as cmds

HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

max = int(cmds.playbackOptions( q=True, aet=True))
servo_1 = [cmds.getAttr("joint2.rotateY")]

data_string = pickle.dumps(servo_1)
s.send(data_string)

data = s.recv(4096)
data_arr = pickle.loads(data)
s.close()
print 'Received', repr(data_arr)
...