我在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;来完成连接时)
答案 0 :(得分:0)
p.communicate()
将阻塞,直到进程终止,因此它可以返回该进程的所有输出。你想在非阻塞模式下使用它,在SO上搜索它应该会出现一些很好的例子。
您可能还想查看使用pexpect
模块。
答案 1 :(得分:0)
通过向dev / null发送任何输出并为进程设置背景来找到解决问题的方法:
./itnl --iport 22 --lport 2222 > /dev/null 2>&1 &
不太理想,因为我现在无法获取stdout来查看设备是否已连接,但它会将我返回到终端提示并允许进一步的命令。