Python ssh с тканью, код 127

Я пытаюсь использовать Fabric в Python для отправки команд в программу на другом компьютере.

Этот код работает нормально:

from fabric.api import env, run

env.host_string = 'xxx.xxx.xxx.xxx'
env.user = 'username'
env.password = 'password'

run('ls')

Но когда работает

run('rostopic list')

я получил

Warning: run() received nonzero return code 127 while executing 'rostopic list'!
'/bin/bash: rostopic: command not found'

Однако на самой машине, если я бегу

rostopic list

он работает так, как должен

Я не уверен, как поступить, и я не понимаю, почему это не работает с тканью. К вашему сведению, я пытался реализовать это с помощью paramiko, но у меня тоже были проблемы, но с pxssh все работает нормально. Проблема в том, что мне нужно это для работы на Windows, а pxssh не совместим. Как я могу заставить эту команду работать с тканью?

1 ответ

Из комментариев, которые вы сделали о проблемах с путями, кажется, что вам нужно будет использовать некоторую комбинацию path, cd и / или prefix контекстные менеджеры для запуска команд ROS (операционной системы робота) через соединение SSH. Возможно, вы также захотите устранить неполадку, полностью вытеснив Fabric и вместо этого поработав над тем, чтобы заставить команду работать через ssh -t, вот так:

$ ssh user@machine -t "cd /my/home/directory && /opt/ros/indigo/bin/rostopic list"

Пример использования контекстных менеджеров с Fabric будет выглядеть так:

with path('/opt/ros/indigo/bin/'):
    with prefix('always run this command'):
        with cd('/my/special/directory'):
            run('rostopic list')

Это довольно надумано, но, надеюсь, иллюстрирует суть. Независимо от того, я бы сначала убедиться, что вы можете запустить команду через ssh -t, Решение этой проблемы, вероятно, приведет вас к правильному способу сделать это с помощью Fabric.

Как побочное замечание: это виртуальная среда на вашей удаленной машине? Вы могли бы использовать prefix контекстный менеджер для его активации, вот так:

with prefix('/opt/ros/indigo/bin/activate'):
    run('rostopic list')

Или используя ssh -t, вы можете выполнить:

$ ssh user@machine -t "/opt/ros/indigo/bin/activate && rostopic list"
Другие вопросы по тегам