我有以下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.