【发布时间】:2014-12-30 11:08:17
【问题描述】:
最近我一直在玩Popen。我在后台生成了一个进程,将输出写入TemporaryFile:
f = tempfile.TemporaryFile()
p = subprocess.Popen(["gatttool"], stdin = subprocess.PIPE, stdout = f)
现在它的工作方式是我通过stdin 向进程发送命令并稍后读取临时文件。而且它是非阻塞的,所以我可以执行其他任务。
问题是gatttool 有时会自己生成一些输出字节(例如通知)。我正在寻找一种在不阻塞TemporaryFile的情况下读取此输出的方法。
我的问题:
1) 从TemporaryFile(50 行)读取输出并希望subprocess 优雅地等待我读取该数据是否安全,或者它会终止吗?
2) 有没有一种优雅的方法来创建一个回调函数,该函数将在TemporaryFile 上的每个事件上调用(而不是让一个线程每秒运行一次并读取数据)?
【问题讨论】:
-
看起来是命名管道(而不是普通文件)的一个很好的用例。
-
也许:docs.python.org/2.2/lib/os-fd-ops.html 并简单地使用 pipe() ?
-
就我个人而言,我喜欢在子进程周围使用更高级别的包装器,例如
sh模块 - 这就是为什么我发布 cmets 而不是编写正确答案的原因。 -
1) 是什么让您认为从
f文件读取对子进程有任何影响?你在 Windows 上吗? 2)有文件系统监控工具,但它是XY problem。如果gatttool产生新行,您是否希望收到通知(例如,通过回调)? -
实际上我已经找到了解决方案,您可以创建一个管道,gatttool 在一端推送数据,而在另一端您只需接收数据。似乎暂时有效
标签: python subprocess communication temporary-files