ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-10-11 23:55:43  阅读:212  来源: 互联网

标签:python bash subprocess popen


我有以下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,bash,subprocess,popen
来源: https://codeday.me/bug/20191011/1896421.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有