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"