Bash 管道到 python

2024-01-10

我需要通过管道实时吸收 bash 命令的输出。 例如

for i in $(seq 1 4); do echo $i; sleep 1; done | ./script.py

script.py 哪里有这个

for line in sys.stdin.readlines():
        print line

我期望序列可用时被打印出来,但 python 脚本正在等待 bash 脚本结束然后再继续。

我在看this https://stackoverflow.com/questions/2082850/real-time-subprocess-popen-via-stdout-and-pipe相关答案,但这并没有解决我的问题。我该如何在 python 中实现这一目标?


第一个问题是readlines https://docs.python.org/2.7/library/stdtypes.html#file.readlines将所有行读入列表中。在所有行都存在之前它无法做到这一点,直到stdin已达到 EOF。

但你实际上并不需要list的行,只是一些可迭代的的线条。还有一个文件,比如sys.stdin, 已经is这样一个可迭代的。而且它是一种懒惰的方式,只要一行可用,就一次生成一行,而不是等待一次生成所有行。

So:

for line in sys.stdin:
    print line

每当你发现自己伸手去够readlines,问问自己是否真的需要它。答案将always不。 (嗯,除非你想用参数调用它,或者在一些有缺陷的、不完全像文件的对象上调用它。)参见阅读线被认为是愚蠢的 http://stupidpythonideas.blogspot.com/2013/06/readlines-considered-silly.html了解更多。


但与此同时,有一个second问题。这并不是说Python正在缓冲它的stdin,或者其他进程正在缓冲其stdout,但是文件对象迭代器本身正在进行内部缓冲,这可能(取决于您的平台 - 但在大多数 POSIX 平台上,通常会)阻止您到达第一行,直到 EOF,或者至少直到很多行已被读取。

This is a known problem with Python 2.x, which has been fixed in 3.x,* but that doesn't help you unless you're willing to upgrade.

该解决方案在命令行和环境文档以及大多数系统的联机帮助页中都有提及,但隐藏在-u标记文档 https://docs.python.org/2/using/cmdline.html#cmdoption-u:

请注意,xreadlines()、readlines() 和文件对象迭代器(“for line in sys.stdin”)中有内部缓冲,不受此选项的影响。要解决此问题,您需要在“while 1:”循环中使用“sys.stdin.readline()”。

换句话说:

while True:
    line = sys.stdin.readline()
    if not line:
        break
    print line

Or:

for line in iter(sys.stdin.readline, ''):
    print line

对于不同的问题,在这个答案 https://stackoverflow.com/questions/3670323/setting-smaller-buffer-size-for-sys-stdin/3670470#3670470,Alex Martelli 指出你总是可以忽略sys.stdin and re-fdopen文件描述符。这意味着您将获得 POSIX fd 的包装器,而不是 C stdio 句柄。但这对于this问题,因为问题不在于 C stdio 缓冲,而在于file.__iter__缓冲与其相互作用。


* Python 3.x doesn't use the C stdio library's buffering anymore; it does everything itself, in the types in the io https://docs.python.org/3/library/io.html module, which means the iterator can just share the same buffer the file object itself is using. While io is available on 2.x as well, it's not the default thing you get for open—or for the stdio file handles, which is why it doesn't help here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 管道到 python 的相关文章

随机推荐

  • 限制可变参数模板参数

    我们可以将可变参数模板参数限制为某种类型吗 即 实现这样的目标 当然不是真正的 C struct X auto foo X args 这里我的目的是有一个接受可变数量的函数X参数 我们最接近的是 template
  • 使用辅助方法为 Java 对象生成测试数据时提供默认值

    假设有以下 POJO Getter Setter public class UserRequest private String username private String password private String email 现
  • iPhone 的 JSON 库

    我想在我的 iPhone 项目中使用 JSON 库 我发现 json framework 库是目前最流行的 在这里能找到它 http code google com p json framework http code google com
  • 使用 Java 发送零数据 TCP/IP 数据包

    我的目标是发送一个带有空数据字段的 TCP 数据包 以便测试与远程计算机的套接字 我正在使用 OutputStream 类的 write byte b 方法 我的尝试 outClient ClientSocket getOutputStre
  • Angular ng 服务不在本地主机上托管站点

    当我跑步时ng serve在我的 CLI 上 我得到以下输出 Angular Live Development Server 正在监听 localhost 4200 打开浏览器 http localhost 4200 但是当我在浏览器中打开
  • azure devops 本地代理管道权限被拒绝

    我有一个 python 脚本 可以在远程 SUT 上执行自动化脚本 并且考虑到该脚本在使用用户 tester 和密码 xxx 在本地执行时正常工作 当我构建 DevOps Azure 管道时 我已从 GIT 将项目签出到代理中 然后尝试从命
  • PHP 中传递给 exec 的命令长度有限制吗?

    目前我需要将 50 多个 PDF 文件合并为 1 个 PDF 我正在使用 PDFTK 使用以下指南 http www johnboy com blog merge multiple pdf files with php http www j
  • 如何关闭hbm2ddl?

    我找不到有关如何关闭 hbm2ddl 的参考 只是省略hibernate hbm2ddl auto默认情况下 Hibernate 不执行任何操作 来自参考文档 1 1 4 休眠配置 http docs jboss org hibernate
  • Mysql 查询发布日期减去 7 天

    这不断出现错误 我不明白为什么 SELECT i user id FROM SELECT SUM us score AS score sum us user id FROM user scores us WHERE us created g
  • 特殊字符未按预期显示

    我有以下简单的 HTML 页面 div m ywe div 当在 Chrome 或 Firefox 中显示它时 我没有测试其他浏览器 我看到以下内容 m ywe 我错过了什么 html 文件以 UTF 8
  • 将 JSON 数据写入磁盘

    编写 JSON 数据 NSDictionary 并再次读取它的最简单方法是什么 我知道有 NSFileManager 但是有没有一个开源框架库可以使这个过程变得更容易 iOS5 NSJSONSerialization 类是否支持将数据写入磁
  • 带有 jquery 的 Django 模板:现有页面上的 Ajax 更新

    我有一个带有表单的 Google App Engine 当用户单击提交按钮时 将调用 AJAX 操作 服务器将输出一些内容并附加到其来源页面的末尾 怎么样 我有一个 Django 模板 我打算使用 jquery 我有以下观点 welcome
  • 传感器的本机模块不可用。 React-Native链接运行成功了吗?

    我遵循了第一步React Native教程在这里 https facebook github io react native docs getting started html https facebook github io react
  • 在 Primefaces 中的不同布局单元之间拖放

    我在全页 Primefaces 布局中有 4 个布局单元 我在西布局单元中有输出标签 我想将其拖放到中心布局单元 我想要将输出标签拖放到此处的拖放区域是 tabView 中的一个面板 当我开始拖动outputLabel时 它不会从西布局单元
  • Snakemake:如何记录由 script 指令执行的 python 脚本?

    有没有什么方法可以轻松保存来自snakemake规则执行python脚本的日志script指示 该脚本使用的库已经有一些集成的日志记录 我想存储它们的日志 我不想使用shell or run指令 因为在使用 python 脚本时它们都不太舒
  • 用于读写的 Java FileLock

    我有一个进程 会从 cron 中频繁调用来读取其中包含某些与移动相关的命令的文件 我的进程需要读取和写入此数据文件 并将其锁定以防止其他进程在此期间接触它 用户可以执行完全独立的过程来 可能 写入 附加到同一数据文件 我希望这两个进程能够正
  • 在 Heroku 应用程序之间共享 Python 代码

    我有 2 个 Heroku 应用程序 都是 Pyhon 以及它们之间共享的一些 python 模块 即 它们在两个应用程序中是相同的 设置 git requirements txt 以实现以下目标的最佳方法是什么 共享代码是版本化的 也就是
  • 有没有办法在打字稿中实例化通用文字类型?

    我想做一些可能非正统的事情 如果我们诚实的话 几乎没有用 所以我们开始 我想传递一个文字作为通用参数 然后实例化它 考虑以下示例 const log console log class Root
  • 在 apache httpd 反向代理和 Tomcats 之间进行双向 SSL 身份验证

    我有一个 Apache HTTPD 作为反向代理 还有 Tomcat 6 0 35 服务器 我想要实现的是 Tomcat 服务器和反向代理之间存在相互信任 这意味着当反向代理转发请求时 它将提供自己的证书 该证书将被导入到 Tomcat 的
  • Bash 管道到 python

    我需要通过管道实时吸收 bash 命令的输出 例如 for i in seq 1 4 do echo i sleep 1 done script py script py 哪里有这个 for line in sys stdin readli