首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帕拉米科的阅读方法对我都不管用?

帕拉米科的阅读方法对我都不管用?
EN

Stack Overflow用户
提问于 2016-04-21 20:55:39
回答 1查看 53关注 0票数 2

我有一堂我写过的课:

代码语言:javascript
复制
class Remote(object):
    def __init__(self, address, username, password):
        self.address  = address
        self.username = username
        self.password = password

    def stdout(self, s):
        print('out: ' + s)

    def stderr(self, s):
        print('err: ' + s)

    def sh(self, s):
        from paramiko  import AutoAddPolicy, SSHClient
        from threading import Thread
        from time      import sleep

        ssh = SSHClient()
        ssh.set_missing_host_key_policy(AutoAddPolicy())
        ssh.connect(self.address, username = self.username, password = self.password)
        stdin, stdout, stderr = ssh.exec_command(s)

        def monitor(channel, method):
            while True:
                for line in channel.readlines():
                    method(line)
                sleep(1)

        Thread(target = monitor, args = (stdout, self.stdout)).start()
        Thread(target = monitor, args = (stderr, self.stderr)).start()

然后我试着像这样运行它:

代码语言:javascript
复制
>>> from remote import Remote
>>> address  = <removed>
>>> username = 'root'
>>> password = <removed>
>>> r = Remote(address, username, password)
>>> r.sh('echo Hello')

而我没有输出。如果我将监视器方法更改为这样,而不是:

代码语言:javascript
复制
for line in channel.readlines():
    method(line)

我有简单的method(channel.read())method(channel.readline()),但在这种情况下,我只看到:

代码语言:javascript
复制
out:
err:

一秒钟-它从来没有给我预期的结果:

代码语言:javascript
复制
out: Hello

我知道我的地址、用户名和密码都没问题,因为我可以把它们输入fabric

代码语言:javascript
复制
>>> from fabric.api        import env
>>> from fabirc.operations import sudo
>>> env.host_string, env.user, env.password = address, username, password
>>> sudo('echo Hello')
[<omitted>]: Hello

在基于paramiko的类中,fabric显然能够处理哪些错误?

编辑

我希望这个方法是异步的。它应该马上回来。例如,如果我这样做:

代码语言:javascript
复制
r1 = Remote(<one set of credentials removed>)
r2 = Remote(<another set of credentials removed>)
r1.sh('echo Hello; sleep 5; echo World')
r2.sh('echo Hello; sleep 5; echo World')

结果应该是:

代码语言:javascript
复制
out: Hello
out: Hello
out: World
out: World

指示这两个调用并行运行,而不是:

代码语言:javascript
复制
out: Hello
out: World
out: Hello
out: World

这表明这两个调用是同步运行的。

EN

回答 1

Stack Overflow用户

发布于 2016-04-22 10:41:39

问题是while True循环在monitor中阻止线程结束。保留第一部分原样,并将最后一行改为:

代码语言:javascript
复制
def monitor(channel, method):
    while True:
        l = channel.readline()
        if l:
            method(l)
        else:
            break
tout = Thread(target = monitor, args = (stdout, self.stdout))
terr = Thread(target = monitor, args = (stderr, self.stderr))
tout.start()
terr.start()
tout.join()
terr.join()
ssh.close()

将逐行打印给定命令的输出,同时返回一些内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36780291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档