我是一个新的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
不正确吗?
我也遇到了同样的问题,在看了这篇文章和这个答案之后,我看到解决方案就是调用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()
现在我的代码将被阻止,直到远程命令完成.这里解释了这个方法,请注意警告.
exec_command()是非阻塞的,它只是将命令发送到服务器,然后Python将运行以下代码.
我认为你应该等待命令执行结束,然后继续工作.
"time.sleep(10)"可能会有所帮助,这需要"导入时间".一些例子表明你可以从stdout ChannelFile对象中读取,或者只是使用stdout.readlines(),它似乎从服务器读取所有响应,猜测这可能会有所帮助.
你的代码,上面两行exec_command,它们实际上是在不同的exec会话中运行的.我不确定这对你的案子有什么影响.
我建议你看看demos文件夹中的演示,他们使用的是Channel类,它有更好的API来为shell和exec执行阻塞/非阻塞发送.