【问题标题】:Getting stdout from console从控制台获取标准输出
【发布时间】:2020-08-24 13:47:29
【问题描述】:

我正在尝试制作一个 python 脚本,该脚本将使用 dd if=/dev/sda of=/dev/sdb 克隆(ISO 映像)一个 USB 棒到另一个 USB 上

这是我的问题: 我想创建进度条来显示已完成的工作。

我试过了:

  1. 查看第二个 U 盘的存储空间,但这不起作用,因为 ISO 映像也会扫描未使用的空间
  2. 通过将status=progress 添加到dd 命令,我可以在终端中取得进展,但我不知道如何从python 访问标准输出。我试过subprocess.Popen,run(stdout = PIPE) 有和没有shell = True 阅读process.stdout.read().read(1).readline()communicate()。没有什么对我有用。 (https://www.endpointdev.com/blog/2015/01/getting-realtime-output-using-python/)

我可以在 python shell 中看到进展,但 .read() 函数总是卡住。

我关心的部分代码:

comm = 'sudo dd if=/dev/sda of=/dev/sdb'
cloning = subprocess.Popen(shlex.split(comm),stdout = PIPE,text = True)
while True:
    print(cloning.stdout.read())

我想要一些类似的东西:

while True:
    progress = cloning.stdout.read()
    update_bar(progress)

我在 Raspberry 上使用 python 3.7

感谢您的帮助

【问题讨论】:

  • 如果您可以提供一些与您正在运行的命令提供相同或相似输出的 python 代码,这将很有用,这样我们就可以帮助您而无需找到 USB
  • 您不应该将答案编辑到您的问题中。这就是答案部分的用途。

标签: python python-3.x subprocess pipe


【解决方案1】:

您在 status=progress 的正确轨道上,但它输出到 stderr,而不是 stdout。如果您执行stderr = PIPE 然后从cloning.stderr 而不是cloning.stdout 读取,它将起作用。

【讨论】:

  • 感谢我自己在尝试通过将 stdout 保存到文件来解决问题时自己想通了,但没有任何显示。仍然困扰我为什么在stderr 中可以正常工作。
  • 因为dd 经常在没有of 的情况下使用,在这种情况下,它复制的数据会进入标准输出。
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多