我有以下 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 ~]$
- 为什么 Python 进程在第二次 Popen 调用时停止? (被 tty 输入停止),如何避免它?
- 为什么在 echo 'works1' 完成后收到注销消息,以及如何避免它?
回答问题1:
这是因为交互式 bash shell 期望连接到终端(“控制终端”)并获取它以处理作业控制中断(例如 Control-Z)。第二次调用尝试获取终端但无法,因此被暂时挂起。
回答问题2:
communicate
将其参数写入子进程的 stdin 管道,然后关闭它。当标准输入耗尽时,Bash 将终止(就像在 bash 终端会话中输入 Control-D)。
如果你想让 bash 子进程保持运行,那么直接写入它的 stdin 而不是使用communicate
如下:
bash1.stdin.write("echo 'works1'\n")
顺便说一句,如果您希望命令实际执行,您确实需要添加换行符。
一个办法:
如果要运行两个或多个交互式 shell,则应该将每个 shell 的 stdin 设置为伪终端而不是子进程 PIPE。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)