Перенос сетки из одного процесса в другой в PYTHON - PullRequest
0 голосов
/ 01 октября 2019

Я ломал голову над этим, но мне еще ничего не приходит в голову. Я хочу, чтобы мой скрипт выполнял файл .py внутри другого уже запущенного процесса. У меня открыт процесс Maya, и внутри, например, modo, я хочу запустить файл hello.py (напечатать 'hello!') Внутри этой точной Maya.

Я уже получил PID этого процесса Maya, но нене знаю, как на самом деле отправить команду для выполнения.

есть ли какой-то атрибут / флаг в подпроцессных или сигнальных модулях, которые я мог пропустить? или это сделано даже по-другому?

import os

openedMaya = []
r = os.popen('tasklist /v').read().strip().split('\n')
for i in range(len(r)):
    s = r[i]
    if 'maya.exe' in s and ': untitled' in s:
        openedMaya.append(s)
mayaPID = openedMaya.split('maya.exe')[1].split('Console')[0]

Мне нужна команда, которая могла бы выполнить hello.py в этом процессе Maya.

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Вы можете использовать RPyC, чтобы действовать как мост, чтобы вы могли обмениваться данными из одного программного обеспечения в другое. Идея состоит в том, что вы используете RPyC для запуска незанятого сервера в Maya, где PYTHONPATH также указывает на ваш hello.py скрипт. Этот сервер остается активным в сеансе, но пользователь не должен замечать его существование.

Затем в вашем другом программном обеспечении вы используете RPyC для широковещательной рассылки сообщения, используя тот же порт, что и сервер, чтобы оно вызывало его. в майя. Затем вы запустите вашу команду.

Это немного больше накладных расходов, но я смог успешно использовать это для автономных инструментов для запуска событий в Maya. Что касается использования subprocess, вы можете использовать его для запуска команды в новом сеансе Maya, но я не думаю, что есть способ использовать его для существующего.

Надеюсь, что подтолкнет вас в правильном направлении.

0 голосов
/ 03 октября 2019

Спасибо за советы, в конце концов я нашел решение, открыв порт maya, запустив команду mel (при запуске):

commandPort -n ":<some_port>";

и подключившись из modo к этому порту черезсокет:

HOST = '127.0.0.1'
PORT = <some_port>
ADDR=(HOST,PORT)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)
client.send(<message_that_you_want_to_send)
data = client.recv(1024)
client.close()

и я могу делать все, что захочу в этой открытой майе, пока я посылаю команды mel.

Хотя спасибо за помощь!

0 голосов
/ 02 октября 2019

Возможно, более простым способом было бы перенести вашу сетку с помощью промежуточного файла. Один процесс создает файл, другой процесс (запущенный внутри хост-приложения) считывает его.

...