我已经运行了下面的代码,它运行正确。您提到过“如果返回代码为非零,请检查输出栏”,请查看check_output docs它引发了一个CalledProcessError异常,您可以捕捉到该异常,并将所有错误详细信息包含在一个很好的结构中。在import threading, subprocess, random, time, pprint
from subprocess import check_output
class WorkerThread(threading.Thread):
def __init__(self, user, host, script, runner):
super(WorkerThread, self).__init__()
self.user = user
self.host = host
self.script = script
self.runner = runner
def run(self):
cmd = "ssh {user}@{host} 'bash -s' < {script}".format(**self.__dict__)
self.runner.complete(check_output(cmd, shell=True))
class Runner(object):
def complete(self, output):
print 'output:\n', output
WorkerThread('marwan', 'homebox', 'local_script.sh', Runner()).start()
上面的代码遵循您在问题中发布的相同结构。但我不建议你采取这种方法这里有一些建议:从您称为runner的WorkerThread中,我不知道runner的详细信息,但是在进行多线程编程时,最健壮的线程安全选项是使用Queue进行通信。在
这里有许多优秀的库,它们可以像您在这里所做的那样。他们经过了很好的测试,而且做得很干净。paramiko非常好,Fabric也非常好。在
简单结构远程运行示例
^{pr2}$