如何使远程执行的pexpect spawn完全等待命令解决,然后再继续?

时间:2017-04-21 12:49:26

标签: python linux ssh pexpect qnx

我正在使用pexpect连接到运行QNX的远程计算机,上传exectuable,运行可执行文件,然后将结果返回到我的本地计算机。

我的问题是这样:命令执行得很好,但是我丢失了所有记录的结果,因为一旦我执行命令来运行我的应用程序,该过程就会返回给我(让我们调用它./application),一个C ++可执行文件。我需要做的是让进程等到命令完全运行完毕后才继续运行。

我尝试过利用proc.wait()无济于事,我最好的猜测是因为proc是SSH会话,而不是运行./application启动的进程。我已经尝试了proc.expect(" bash-username $")和类似的,只是发现应用程序立即返回。

代码相当简单明了,但并不像我希望的那样完全没有预期。以下是我如何进行操作的示例:

var printerList = PrinterSettings.InstalledPrinters.Cast<string>().ToList();
bool printerFound = printerList.Any(p => p == printerName);

if (printerFound)
{
    //Do print stuff
}
else
{
    //throw exception or send message
}

所以基本上每次运行时,它会在函数执行命令后立即继续执行代码的下一部分,似乎并不关心proc.expect。我错误地使用了这个吗?如何使进程等待命令执行完毕,而不仅仅是发送行并立即返回?

1 个答案:

答案 0 :(得分:0)

我找到了解决自己问题的方法,利用子进程模块而不是pexpect。

解决方法是使用命令变量为SSH调用subprocess.Popen,如下所示:

command_as_string = '/home/user/applicationExecutable'
ssh = subprocess.Popen(['ssh', '-t', 'username@hostname',
                        command_as_string'],
                                   stderr=subprocess.PIPE,
                                   stdout=subprocess.PIPE,
                                   shell=False,
                                   universal_newlines=True,
                                   bufsize=0
                                   )

它会等到命令解析后再断开连接,并按预期继续处理剩余的Python文件。