Как передать входной аргумент 'byte string' в функцию python, вызываемую из MATLAB? - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь вызвать функцию Python из MATLAB. В этой функции Python входной аргумент имеет тип «байтовая строка». Я не смог передать аргументы 'byte string' в Python

Я пытаюсь создать приложение сервер-клиент, используя ipc, где сервер - это чистое приложение Python, а клиент - приложение MATLAB, которое вызывает функции python. У меня установлена ​​Anaconda с Python 3.7.

Код Python-сервера:

from multiprocessing.connection import Listener

address = ('localhost', 6000)     # family is deduced to be 'AF_INET'
listener = Listener(address, authkey=b'secret password')
conn = listener.accept()
print('connection accepted from', listener.last_accepted)
while True:
    msg = conn.recv()
    print(msg)
    if msg == 'close':
        conn.close()
        break
listener.close()

Код клиента Python (для тестирования):

from multiprocessing.connection import Client

address = ('localhost', 6000)
conn = Client(address, authkey=b'secret password')
conn.send('close')
can also send arbitrary objects:
conn.send(['a', 2.5, None, int, sum])
conn.close()

При выполнении в Python вышеуказанная пара сервер-клиент работает нормально.

Теперь пытаемся использовать MATLAB, эквивалентный приведенному выше клиентскому коду Python в командной строке:

>> mp_pyModule = py.importlib.import_module('multiprocessing.connection');
>> client_fn = mp_pyModule.Client;
>> address = py.tuple({'localhost',int16(6000)});
>> conn = client_fn(address,pyargs('authkey','secret password'));
Error using connection>Client (line 495)
Python Error: TypeError: authkey should be a byte string

Я знаю, что передал нормальную строку выше, и это является причиной ошибки. Я требую, чтобы приведенный выше аргумент «секретный пароль» был отправлен как «строка байтов». Как это можно сделать?

Неподдерживаемые типы для Python (https://in.mathworks.com/help/matlab/matlab_external/unsupported-matlab-types.html) ничего не упоминает об этом. Есть ли другие ограничения? Если я перейду на Python 2, это может сработать.

1 Ответ

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

Решение найдено: Используйте py.bytes (uint8 (строка))

например: conn = client_fn(address,pyargs('authkey',py.bytes(uint8('secret password'))));

кредитов - Уолтер Роберсон @ Mathworks

...