【发布时间】:2017-04-21 12:49:26
【问题描述】:
我正在使用 pexpect 连接到运行 QNX 的远程计算机,上传可执行文件,运行可执行文件,然后将结果带回我的本地计算机。
我的问题是:命令执行得很好,但是我丢失了所有记录的结果,因为一旦我执行命令来运行我的应用程序(我们称之为 ./application),进程就会返回给我,这是一个 C++ 可执行文件。我需要做的是让进程等到命令完全完成运行后再继续。
我尝试使用 proc.wait() 无济于事,我最好的猜测是这是因为 proc 是 SSH 会话,而不是通过运行 ./application 启动的进程。我已经尝试过 proc.expect("bash-username$") 和类似的,只是发现应用程序仍然立即返回。
代码相当简单明了,但并不像我希望的那样。这是我如何进行操作的示例:
// This section all works fine. Establish SSH and expect Last Login info
ssh_cmd = ssh_cmd = "ssh " + self.user + "@" + self.hostname
self.proc = pexpect.spawn(ssh_cmd)
self.proc.expect("Last login", timeout = 5)
print("SSH login successful!")
self.is_connected = True
// Problems are here. Outside scope executes a command now by calling this:
// Let's say the command here is Sleep 5. Or an executable ./application
//The Pexpect below SHOULD wait until it finishes executing, but it
doesn't Sleep for 5 seconds or wait for ./application, this expect
line returns IMMEDIATELY every time.
def execute_command(self, command):
if self._is_connected:
self.proc.sendline("command")
self.proc.expect("username:/")
所以基本上每次运行时,它都会在函数执行命令后立即继续到下一部分代码,似乎并不关心 proc.expect。我是否错误地使用了这个?我怎样才能让进程等到命令真正完成执行,而不仅仅是发送行并立即返回?
【问题讨论】:
-
你怎么知道命令已经实际上完成了?
-
@whjm 主 python 文件继续运行,尽管它应该等待命令以期望完成。如果我在远程机器运行时运行“ps”,我可以看到 ./application 出现,因此命令发送成功。如果我 mkdir 或做任何有形的事情,它们会在远程机器上创建。这些命令都解决了,但是我在程序运行时挂起的方式似乎并没有真正起作用。如果没有某种强制 time.sleep 或等待,它只会在其他命令运行时执行每个命令,而不是等待。
-
我的意思是如果你手动运行命令你怎么知道它已经完成了?它会在退出之前打印一些东西吗?
-
因为它是用来执行任何命令的工作服,所以这是一个粗略的“有时,但并非总是”的答案。但是,在这种情况下,我可以强制执行此特定应用程序,然后尝试期待该输出并查看会发生什么。虽然不确定这对于实际执行有多现实,但它肯定有助于调试。作为旁注,命令的 bash 返回值可能是在所有情况下检索的理想值,但我似乎无法弄清楚如何从 pexpect 中获取它。 sendline() 返回写入的字节数,不幸的是不是返回码。
标签: python linux ssh pexpect qnx