不能使用popen启动两个交互式shell

我有以下Python代码段,无法解释其行为方式.

import subprocess  
bash1 = subprocess.Popen(["/bin/bash","-l", "-i"], stdin=subprocess.PIPE)  
print "Checkpoint 1"  
bash2 = subprocess.Popen(["/bin/bash","-l", "-i"], stdin=subprocess.PIPE)  
print "Checkpoint 2"  
bash1.communicate("echo 'works1'")  
bash2.communicate("echo 'works2'")  
print "OK"

运行它时,得到以下输出

[user@localhost ~]$python test.py  
Checkpoint 1  
Checkpoint 2  
[1]+  Stopped                 python test.py
[user@localhost ~]$[user@localhost ~]$echo 'works1'  
works1  
[user@localhost ~]$logout  
[user@localhost ~]$fg    
python test.py  
[user@localhost ~]$echo 'works2'  
works2  
[user@localhost ~]$logout 
OK  
[user@localhost ~]$

>为什么第二次Popen调用会停止Python进程? (由tty输入停止),如何避免呢?
>回显“ works1”完成后,为什么会出现注销消息,如何避免?

解决方法:

回答问题1:

这是因为交互式bash shell希望连接到终端(“控制终端”)并获取它,以便处理作业控制中断(例如Control-Z).第二次调用尝试获取终端,但是无法获取,因此被暂时挂起.

对问题2的回答:

communication将其参数写入子进程的stdin管道,然后将其关闭. Bash在其stdin用尽时终止(就像在bash终端会话中输入Control-D一样).

如果要保持bash子进程运行,请直接写入其stdin而不是按以下方式使用communication:

bash1.stdin.write("echo 'works1'\n")

顺便说一句,如果您希望命令实际执行,则需要添加换行符.

一个解法:

如果要运行两个或多个交互式Shell,则应将每个Shell的标准输入设置为pseudo-terminal,而不是子进程PIPE.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...