Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使远程执行的pexpect spawn在继续之前完全等待命令解析?_Python_Linux_Ssh_Pexpect_Qnx - Fatal编程技术网

Python 如何使远程执行的pexpect spawn在继续之前完全等待命令解析?

Python 如何使远程执行的pexpect spawn在继续之前完全等待命令解析?,python,linux,ssh,pexpect,qnx,Python,Linux,Ssh,Pexpect,Qnx,我正在使用pexpect连接到运行QNX的远程计算机,上载一个可执行文件,运行可执行文件,然后将结果带回本地计算机 我的问题是:命令执行得很好,但是我丢失了所有记录的结果,因为一旦执行命令运行我的应用程序(让它调用./Application),进程返回给我,一个C++可执行文件。我需要做的是让进程等到命令完全运行完毕后再继续 我尝试过使用proc.wait()但没有效果,我的最佳猜测是,这是因为proc是SSH会话,而不是通过运行./application启动的进程。我尝试了proc.expec

我正在使用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。我用错了吗?如何让流程等待命令实际执行完毕,而不仅仅是发送行并立即返回?

我找到了解决自己问题的方法,使用子流程模块而不是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文件的其余部分。

您如何知道命令实际已完成?@whjm主Python文件将继续运行,但它应等待命令完成expect。如果在远程计算机运行时在其上运行“ps”,我可以看到./application显示,因此命令发送成功。如果我使用mkdir或做任何有形的事情,它们都是在远程机器上创建的。这些命令都解决了问题,但我在程序运行时挂起的方式似乎不起作用。没有强制时间。某种睡眠或等待,它只会在其他命令运行时执行每个命令,而不是等待。我的意思是,如果你手动运行命令,你怎么知道它完成了?它在退出之前打印什么吗?因为它是用来执行任何命令的工作服,所以这是一个粗略的“有时,但不总是”回答。然而,在这种情况下,我可以强制这个特定的应用程序,然后尝试期望输出,看看会发生什么。虽然不确定这对于实际执行有多现实,但它肯定会有助于调试。作为旁注,命令的bash returnvalue可能是在所有情况下都可以检索的理想对象,但我似乎不知道如何从pexpect获取它。sendline()返回写入的字节数,而不是返回代码。