不能使用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.

上一篇:python-subprocess.call与os.system有何不同


下一篇:如何使用python以编程方式计算存档中的文件数