如何解决Unix 脚本命令在解除缓冲时中断终端
对不起,标题不稳定,也许有人可以改进它。
我在 Python 子进程中使用 script 命令对命令的输出进行缓冲。然后我从该过程中读取了一行,最后打印了一些文本。这是我的代码(此文件名为 script.py
):
import subprocess
import time
proc = subprocess.Popen(["script","-q","-c","cat script.py","/dev/null"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
# proc = subprocess.Popen(["stdbuf","-oL","-eL","cat","script.py"],# stdout=subprocess.PIPE,stderr=subprocess.PIPE)
proc.stdout.readline()
print("printing before...")
print("printing before...")
print("printing before...")
time.sleep(2)
print("printing after...")
print("printing after...")
print("printing after...")
我得到了这种绝对奇怪的行为,这样当子进程写入标准输出时,后续的 python 打印语句在每行之后包含几个空格,直到进程终止。这是它的外观截图:
据我所知,它在每行之后打印与终端中列数相同的空格数。我认为这可能与回车有关,但我真的不知道。我不明白为什么这会影响 python 的输出,因为我在执行 stdout
时同时抑制了 stderr
和 Popen
。
我在 arch linux、python 版本 3.8.6 和 uname -a
输出上运行它:
Linux carbon 5.9.10-arch1-1 #1 SMP PREEMPT Sun,22 Nov 2020 14:16:59 +0000 x86_64 GNU/Linux
如果我能提供任何其他信息,请告诉我。
解决方法
因为你的子进程 stdin
仍然是一个 TTY,script
已经到达并改变了处理 CR 和 LF 的模式。您的前 3 次打印是在 script
仍在后台运行时进行的。在睡眠期间,script
修复终端并退出。如果您等待子流程完成,问题就会消失……通常。信号可能会阻止 script
自行清理并破坏剩余的会话。可能更好的选择是重定向标准输入。
proc = subprocess.Popen(["script","-q","-c","cat script.py","/dev/null"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
这一切都相当冒险。如果执行的程序写入足够的数据来填充其标准输出管道,它将挂起。如果您只想要希望在 TTY 下运行的程序的第一行,您可以使用 pty.spawn
来完成这项工作。有趣的是,它的文档有一个 EXAMPLE script
implementation。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。