【问题标题】:Write to a Python subprocess's stdin without communicate()'s blocking behavior在没有通信()阻塞行为的情况下写入 Python 子进程的标准输入
【发布时间】:2019-11-08 15:20:45
【问题描述】:

如何使它成为非阻塞调用? osd_cat 仅接受作为 PIPE 的输入,这需要 p.communicate() 调用来阻止进程。有没有其他方法可以在Popen中设置stdin

p = subprocess.Popen(('osd_cat',
                      '-d',
                      '{}'.format(interval)),
                     stdin=subprocess.PIPE)
p.communicate(message)

【问题讨论】:

  • 使用 Python 多处理并将您的子任务放在另一个进程中。使用消息队列与它交谈。
  • Waitaminute,你被困在的是如何喂给stdin?在提问之前您是否尝试过p.stdin.write()? (是的,您需要在单独的线程中执行此操作以防止在主进程中阻塞,但这是线程的优点之一)。

标签: python linux subprocess blocking


【解决方案1】:

p.communicate 方法在向进程发送数据方面是一次性的。

请直接写信给p.stdin。如果要获取输出,可以从p.stdout 读取行。确保在尝试读取之前将 stdout=subprocess.PIPE 传递给构造函数。

【讨论】:

  • 为什么p.communicate 在传递字符串时会阻塞?它可以在内部关闭管道,因为我们正在传递一个字符串..对吗?
  • @Jean。这正是它设计和记录的目的。它可以选择发送一个字符串,然后等待进程关闭其标准输出(通常通过终止)。没有特别的首要原因,只是这是使用流程的一种非常常见的方式。也许是名字的选择让人困惑?
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多