无法使用 popen 启动两个交互式 shell

2023-12-01

我有以下 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 ~]$
  1. 为什么 Python 进程在第二次 Popen 调用时停止? (被 tty 输入停止),如何避免它?
  2. 为什么在 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(使用前将#替换为@)

无法使用 popen 启动两个交互式 shell 的相关文章

随机推荐

  • on:click 在 Svelte 中更新 DOM 时不起作用

    The send random 当我将其添加为新添加的 DOM 中的指令时 它不起作用 for let i 0 i lt items length i data div class block received span class ite
  • Selenium WebDriver CSS 选择器帮助 - 用于选择日期

    我需要从小窗口中选择日期 下面是 html 代码示例 有人可以帮我通过 CSSSelector 或任何其他最适合执行此任务的方式选择日期吗 td class a class ui state default href 1 a td td c
  • Bootstrap - 5 列布局

    我正在尝试获得 5 列全宽布局 但找不到适合我需求的解决方案 这是我使用的代码 div class container div class row div class col lg 12 style border 1px solid red
  • 如何共享 Facebook 页面选项卡内部页面的内容?

    我正在尝试共享页面选项卡内部页面上的内容 此页面上的每个项目都有一个 赞 按钮 我想将用户重定向到该页面并通过 JS 滚动到该项目 我最好不要透露该网站的真实网址 换句话说 分享这样的事情 问题是当我尝试分享上面的网址时 Facebook
  • NSData 存储在某处

    最近我创建了一个帖子 NSData 缓存例程 但是 现在我想更具体地说明我的要求 你看 我有 轮播 这实际上是一个有 7 个图像的滚动视图 当它第一次出现时 它会从互联网加载图像并自动滚动 我的问题是 我不想每次滚动时都加载图像 幸运的是
  • 获取我的 wifi IP 地址 Android

    当手机连接wifi时 如何获取手机的ip地址 我找到了一个方法here但即使我在 wifi 下 它也会返回类似 24 182 239 255 的东西 并且我期望类似 192 168 1 10 的东西 我想要这样的东西 if you are
  • 封送切片结果为字符串

    我正在尝试对一部分进行 json 编码uint8值 但这样做会产生字符串 举个例子 这个 d uint8 1 2 3 4 data err json Marshal d fmt Println string data err 结果是 AQI
  • Firefox 中的全屏背景图像

    我有一个覆盖浏览器屏幕的整个宽度和高度的背景图像 它在 Chrome 和 IE 中工作 但在 Firefox 中图像被下推 有什么想法发生了什么吗 CSS HTML div img src http image iloqal com lib
  • 如何从 Telegram 获取公共频道的消息

    我需要阅读电报应用程序中一些公共频道的消息 我想将电报频道文本存储在文本文件中 我想使用Python 我尝试过电视马拉松 但它太复杂了 我的代码有一些错误 from telethon tl functions messages import
  • 有没有办法返回当前登录的设备用户数?

    有没有办法计算出有多少用户使用 devise 主动登录 Rails 应用程序 轨道3 1 gem 设计 gt 1 4 gem dm devise gt 1 5 with 数据库可验证 我正在专门寻找 ruby 代码 由于与登录相关的所有信息
  • CSS Grid 嵌套在wrapper-div 或body 元素中?

    在这个系列中 他们都使用了包装 div MDN CSS 网格布局 这是必要的吗 如果有 为什么 包装器的用途有很多 包括 按语义对元素进行分组 例如分隔页面标题 来自正文 来自侧边栏 来自页脚 从外观上对元素进行分组 例如使用周围的边框或
  • 解决错误代码:1005。无法创建表 '' (errno: 150) 错误

    我正在 mysql 中创建以下三个表 邮政局长 广告 候选人主 这是创建语句 邮政局长 CREATE TABLE postmaster POSTCODE int 2 NOT NULL DEFAULT 0 POSTNAME varchar 2
  • Hive - 可以提取常见选项以便在其他脚本中重用吗?

    我有两个 Hive 脚本 如下所示 脚本A SET hive exec dynamic partition true SET hive exec dynamic partition mode non strict SET hive exec
  • 适用于 Mac 的 VSTO?

    我使用 VSTO 构建了一个自定义 Outlook 工具栏选项 该选项将电子邮件记录在数据库中 这在 Windows 中运行良好 然而 有人问我是否可以将其迁移到 Mac for Entourage 我认为这是 Mac 版本的 Outloo
  • 混合托管和非托管 C++ 代码?

    关于将托管 C 与非托管 C 混合使用 我有几个具体问题 如果我遗漏了ref and value在类 结构声明中 这是否会自动使类 结构成为非托管的 或者我还需要包括 pragma unmanaged and pragma managed指
  • scipy imsave 保存错误的值

    我正在尝试编写使用 numpy 和 scipy 生成视差图的代码 但是我在图像的 numpy 数组中存储的值与输出图像中实际显示的值完全不同 并使用杂项保存 我保存 例如 在数组中 没有一个值大于 22 但在图像中 我有从 0 到 255
  • Oracle SQL 正则表达式未返回预期结果

    我正在使用一个在 Java PHP regex 测试器中完美运行的正则表达式 d s d 3 例子 https regex101 com r oH6jV0 1 但是 尝试在 Oracle SQL 中使用相同的正则表达式不会返回任何结果 举个
  • 通过webapp重启tomcat

    我有一个关于通过我的 web 应用程序重新启动 tomcat 服务器的疯狂请求 我为此搜索了近 2 天 我发现的只是执行外部批处理文件或调用另一个程序来执行此操作 使用java代码有没有最佳的解决方案 我错过了什么吗 为什么不直接创建一个脚
  • 如何使用 Objective C 在 iPhone 的表格视图上应用复选标记?

    我正在尝试在表视图中申请复选标记 但它不起作用 如果我再次在该单元格中再次检查 则复选标记适用 但不适用于新选定的单元格 那里有谁能帮助我 谢谢阿米尔 我正在使用以下代码 pragma mark pragma mark Table Data
  • 无法使用 popen 启动两个交互式 shell

    我有以下 Python 代码片段 但无法解释它为什么会这样 import subprocess bash1 subprocess Popen bin bash l i stdin subprocess PIPE print Checkpoi