使用生成器作为子流程输入;出现“对已关闭文件进行 I/O 操作”异常

2023-12-07

我有一个大文件需要在输入另一个命令之前进行处理。我可以将处理后的数据保存为临时文件,但想避免这样做。我编写了一个生成器,它一次处理每一行,然后按照脚本将其作为输入提供给外部命令。但是我在第二轮循环中遇到了“关闭文件上的 I/O 操作”异常:

cmd = ['intersectBed', '-a', 'stdin', '-b', bedfile]
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for entry in my_entry_generator: # <- this is my generator
    output = p.communicate(input='\t'.join(entry) + '\n')[0]
    print output

我读到另一个使用 p.stdin.write 的类似问题。但仍然有同样的问题。

我做错了什么?

[编辑] 我用以下内容替换了最后两个语句(感谢 SpliFF):

    output = p.communicate(input='\t'.join(entry) + '\n')
    if output[1]: print "error:", output[1]
    else: print output[0]

查看外部程序是否有任何错误。但不是。 在 p.communicate 线上仍然有相同的异常。


The communicate的方法subprocess.Popen对象只能被调用一次。它的作用是将您提供的输入发送给流程while读取所有 stdout 和 stderr 输出。我所说的“全部”是指它等待进程退出,以便知道它拥有所有输出。一次communicate返回,该进程不再存在。

如果你想使用communicate,您必须在循环中重新启动该进程,或者为其提供一个字符串all来自生成器的输入。如果你想做流式通信,一点一点地发送数据,那么你就不能使用communicate。相反,您需要写信给p.stdin在阅读时p.stdout and p.stderr。这样做很棘手,因为您无法判断哪个输出是由哪个输入引起的,而且很容易陷入死锁。有一些第三方库可以帮助您完成此任务,例如 Twisted。

如果你想这样做交互地,发送一些数据,然后等待并处理结果,然后再发送更多数据,事情变得更加困难。您可能应该使用第三方库,例如pexpect为了那个原因。

当然,如果您可以在循环内启动进程,那就容易多了:

cmd = ['intersectBed', '-a', 'stdin', '-b', bedfile]
for entry in my_entry_generator:
    p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output = p.communicate(input='\t'.join(entry) + '\n')[0]
    print output
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用生成器作为子流程输入;出现“对已关闭文件进行 I/O 操作”异常 的相关文章

随机推荐

  • Xamarin Forms 列表视图在框架中显示行项目

    您能给我推荐一些示例代码来创建如图所示的框架线吗 正如您在图像中看到的 例如对于第一行 M 应位于一个框架中 而该行中的所有其他 3 个项目应位于另一行中 下面请查看我的代码 感谢任何帮助
  • 如何隐藏平板电脑中的系统导航栏?

    在我的平板电脑上 它有以下栏来控制后退 主页等 我不知道正确的名称 状态栏 控制栏 操作栏 或其他 在程序中 它使用以下方法来实现全屏 requestWindowFeature Window FEATURE NO TITLE getWind
  • 如何将 Excel 工作表导出到新工作簿

    我有一堆包含多个工作表的 Excel 工作簿 我想循环遍历每个工作簿并将每个工作表导出到它自己的新工作簿中 我想要每个新工作簿中都有一个工作表 这是我到目前为止所得到的 Sub ExportWorksheet ByVal worksheet
  • C++ 在 Windows 中发送简单信号

    Windows 上是否有相当于kill 的函数 int kill pid t pid int sig 如果没有 是否可以根据进程的 PID 来测试进程是否正在运行 Thanks Windows 没有 Unix 意义上的信号 您可以使用Ope
  • 构建财务报表数据库

    我正在寻找构建数据库的最佳方法 我有 1000 家公司从 1997 年到 2012 年的季度财务报表 每家公司都有三份不同的报表 损益表 资产负债表和现金流量表 我希望能够对数据执行计算 例如将每个季度相加以获得每个报表上每个行项目的年度总
  • 十六进制字符串转中文字符串

    我有以下代码可以从十六进制转换为 ASCII Hexadecimal to ASCII Convertion private static string hex2ascii string hexString MessageBox Show
  • 如何将模板参数限制为指针或随机访问迭代器?

    有没有办法将模板函数的参数类型限制为仅指针或随机访问迭代器 假设我正在开发一个排序功能 该功能仅适用于可随机访问的容器 我正在寻找一种在用户传递非随机访问迭代器时抛出编译时错误的方法 include
  • 简单的 HTML DOM 空间到类中

    我正在使用简单的 HTML DOM 从网站获取元素 但是当类属性有空格时 我什么也得不到 源 HTML 来自betaexplorer com table class stats table stats main table 2 tbody
  • 如何限制 Spring MVC 控制器的 @RequestMapping 路径中​​的路由扩展?

    我有一个相当简单的任务想要完成 但似乎无法找到有关 Spring MVC 路由的信息 我有一个非常简单的控制器 它将路径路由到视图 Controller RequestMapping value help public class Help
  • SQL Server 2005 db_denydatawriter 示例查询

    我正在尝试将 mydomain myuser 添加到 db denydatawriter 角色 但我可以找到一个简单的查询示例 有人有一个简单的示例吗 如果您还没有设置登录名 用户 只需 3 个步骤 CREATE LOGIN mydomai
  • Bootstrap 元素 100% 宽度

    我想创建交替的 100 彩色块 附件中说明了 理想 情况以及当前情况 所需的设置 现在 我的第一个想法是创建一个 div 类 给它一个背景颜色 并给它 100 的宽度 block width 100 background fff 然而 你可
  • 如何在android中的范围搜索栏中设置两个拇指之间的范围?

    我在我的应用程序中使用范围搜索栏 它工作正常 但我的要求是设置两个拇指之间的范围 默认情况下 两个拇指相互重叠 在我的情况下 拇指不相互重叠 如何设置范围搜索栏中两个拇指之间的范围 下面是我的范围搜索栏类 在我的例子中 两个拇指之间的差异是
  • 从产品获取流会返回一个空集合,其中包含一些动态产品组规则

    我创建了一个装饰 可以自动加载streams对于产品 这使我能够访问店面中的动态产品组 但在使用某些规则时遇到了一些问题 选择特定产品或使用时一切正常productNumber equals number规则 但是当我尝试根据属性值选择产品
  • 灰度背景 CSS 图像

    我在网上搜索了很多 但找不到跨浏览器解决方案来将 css 背景图像淡入灰度并返回 唯一有效的解决方案是应用 CSS3 灰度滤镜 webkit filter grayscale 100 但这仅适用于 Chrome v 15 和 Safari
  • Flutter:语法错误:JSON 中位置 0 处出现意外标记 <

    我需要从 API 获取数据 但我的 try catch 失败并出现 SyntaxError Unexpected token Code String problems try final response await http get ht
  • 在Python中将字符串转换为元组

    好的 我有这个字符串 tc 107 189 我需要它是一个元组 这样我就可以一次将每个数字称为一 print tc 0 needs to output 107 先感谢您 所有你需要的是ast literal eval gt gt gt fr
  • 如何在多个.cpp文件中使用全局变量?

    我有一个简单的程序 它尝试在单独的文件中打印我的全局变量 我正在使用Visual Studio 2013 专业版 IDE print h ifndef PRINT H define PRINT H void Print endif 打印 c
  • ELMAH 异常生成通用“服务不可用”消息

    我正在尝试创建一个可用性页面 该页面检查站点使用的所有服务 将每个检查包装在 try catch 中 然后向用户显示任何失败 其中一项服务是 ELMAH 因此我调用该服务是为了仔细检查我们是否可以成功记录错误 控制器 var a new A
  • 为什么 jquery 自动完成功能在 https(安全页面)上不起作用?

    我试图让 jquery 自动完成功能在 https 安全页面 页面上工作 但它没有显示任何下拉菜单 我搜索了这个问题 发现它的安全问题 谁能告诉我如何在 https 页面上打开此自动完成下拉列表 这是我的 jquery 自动完成代码 fun
  • 使用生成器作为子流程输入;出现“对已关闭文件进行 I/O 操作”异常

    我有一个大文件需要在输入另一个命令之前进行处理 我可以将处理后的数据保存为临时文件 但想避免这样做 我编写了一个生成器 它一次处理每一行 然后按照脚本将其作为输入提供给外部命令 但是我在第二轮循环中遇到了 关闭文件上的 I O 操作 异常