Нельзя избежать сериализации, если нет общей памяти. На проводе есть только байты.
Вы можете использовать библиотеку, которая скрывает это от вас, например, с execnet
модулем:
#!/usr/bin/env python
import execnet
gw = execnet.makegateway("ssh=user@host")
channel = gw.remote_exec("""
import dbus, sys
bus = dbus.SystemBus()
remote_object = bus.get_object('daemon.location', '/daemon')
controller = dbus.Interface(remote_object, 'daemon.path')
channel.send(controller.getValue())
""")
tuple_ = channel.receive()
print tuple_
print tuple_[0]
Но легко разобрать простые значения кортежей, используя ast.literal_eval()
из stdlib:
#fabfile.py
import ast
from fabric.api import run
def getcontroller():
"""Return controller value."""
cmd = """
import dbus, sys
bus = dbus.SystemBus()
remote_object = bus.get_object('daemon.location', '/daemon')
controller = dbus.Interface(remote_object, 'daemon.path')
print repr(controller.getValue())
""" #NOTE: you must escape all quotation marks
output = run('python -c "%s"' % cmd)
tuple_ = ast.literal_eval(output)
print tuple_[0]
Пример: $ fab getcontroller -H user@host
Здесь я использовал fabric
для запуска команды на удаленном хосте.
Вы можете использовать JSON в качестве формата сериализации, если на другом конце не создаются литералы Python:
>>> import json
>>> t = (1, "a")
>>> json.dumps(t)
'[1, "a"]'
>>> json.loads(_)
[1, u'a']
>>>