当前位置:  开发笔记 > 编程语言 > 正文

基本的paramiko exec_command帮助

如何解决《基本的paramikoexec_command帮助》经验,为你挑选了2个好方法。

我是一个新的paramiko用户,并且很难在paramiko的远程服务器上运行命令.我想导出路径并运行tophat在后台调用的程序.我可以登录,paramiko.sshclient()但我的代码exec_command没有结果.

stdin, stdout, sterr = ssh.exec_command('export PATH=$PATH:/proj/genome/programs
/tophat-1.3.0/bin:/proj/genome/programs/cufflinks-1.0.3/bin:/proj/genome/programs/
bowtie-0.12.7:/proj/genome/programs/samtools-0.1.16')

stdin, stdout, sterr = ssh.exec_command('nohup tophat -o /output/path/directory -I 
10000 -p 8 --microexon-search -r 50 /proj/genome/programs/bowtie-0.12.7/indexes
/ce9 /input/path/1 /input/path/2 &')

没有nohup.out文件和python只是转到下一行没有错误消息.我试过没有nohup,结果是一样的.我试图遵循这个paramiko教程.

我使用exec_command不正确吗?



1> yaobin..:

我也遇到了同样的问题,在看了这篇文章和这个答案之后,我看到解决方案就是调用recv_exit_status()Channel 的方法.这是我的代码:

import paramiko
import time

cli = paramiko.client.SSHClient()
cli.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
cli.connect(hostname="10.66.171.100", username="mapping")
stdin_, stdout_, stderr_ = cli.exec_command("ls -l ~")
# time.sleep(2)    # Previously, I had to sleep for some time.
stdout_.channel.recv_exit_status()
lines = stdout_.readlines()
for line in lines:
    print line

cli.close()

现在我的代码将被阻止,直到远程命令完成.这里解释了这个方法,请注意警告.



2> terry..:

exec_command()是非阻塞的,它只是将命令发送到服务器,然后Python将运行以下代码.

我认为你应该等待命令执行结束,然后继续工作.

"time.sleep(10)"可能会有所帮助,这需要"导入时间".一些例子表明你可以从stdout ChannelFile对象中读取,或者只是使用stdout.readlines(),它似乎从服务器读取所有响应,猜测这可能会有所帮助.

你的代码,上面两行exec_command,它们实际上是在不同的exec会话中运行的.我不确定这对你的案子有什么影响.

我建议你看看demos文件夹中的演示,他们使用的是Channel类,它有更好的API来为shell和exec执行阻塞/非阻塞发送.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有