python osx终端线程与subprocess.Popen

时间:2016-11-16 14:33:22

标签: python wxpython subprocess

我在Python中有一个使用subprocess和Popen的程序,但是当我运行一个特定的二进制文件时,一个名为itnl / itunnel的iOS工具,它会保持终端窗口打开以进行日志记录,因此我无法再写任何命令终端,如ssh命令。

我玩过各种各样的选项,包括我在另一个SO线程中找到的创建标志,但它似乎不适用于OSX。

在自制软件安装上运行OSX和python 2.7。

if ("iPhone" in stdout or "iPad" in stdout):
        self.progressBox.AppendText('Device found. Starting iTunnel\n')
        cmd = toolsDir + "/itnl --iport 22 --lport 2222"
        p = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        stdout = p.communicate()[0]
        if "Device connected" in stdout:
            cmd = "ssh -p 2222 root@127.0.0.1"
            p = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

一旦itunnel运行,它就会坐在那里等待来自设备的连接,如下所示:

 [INFO] Waiting for new TCP connection on port 2222
 [INFO] Waiting for device...
 [INFO] Device connected: 6a0a098xxxxxxxx3cb2ef9ef6205

(这是当你输入' ssh等等以及#39;来完成连接时)

2 个答案:

答案 0 :(得分:0)

p.communicate()将阻塞,直到进程终止,因此它可以返回该进程的所有输出。你想在非阻塞模式下使用它,在SO上搜索它应该会出现一些很好的例子。

您可能还想查看使用pexpect模块。

答案 1 :(得分:0)

通过向dev / null发送任何输出并为进程设置背景来找到解决问题的方法:

./itnl --iport 22 --lport 2222 > /dev/null 2>&1 &

不太理想,因为我现在无法获取stdout来查看设备是否已连接,但它会将我返回到终端提示并允许进一步的命令。