代码之家  ›  专栏  ›  技术社区  ›  netrox

用python将实时输出保存到文件

  •  1
  • netrox  · 技术社区  · 6 年前

    花了一整天的时间才弄明白为什么不起作用。这是Python3.6。

    目标是从命令行捕获进度,作为一个例子进行分解。碎片会逐行输出进度。

    对于Python子进程,它似乎无法将任何输出保存到文件中。我做到了:

       cmd_str="sudo shred -v /dev/sde"
       f="/test.log"
    
       with Popen(cmd_str, stdout=f, bufsize=1, universal_newlines=True) as p:
           for line in p.stdout:
               print(line, end='') 
    

    但是它生成了一个错误,说:FileNotFoundError:[Errno 2]没有这样的文件或目录:“sudo shred-v/dev/sde”:“sudo shred-v/dev/sde”,这对我来说毫无意义。

    简单地说,我希望在文件中追加一行新的输出并将其关闭。这样,外部程序就可以检查日志文件,看看进展如何。

    我刚刚观察到,当我使用tee查看它是否正在记录,并且它也没有记录到文件中,尽管创建了日志文件。

    更新:我已经在这个网站上尝试了所有可能的解决方案,但都没有成功。我开始想,这是否与一个进度条不能被发送到stdout有关?这些都是尝试过的,但都失败了:

    live output from subprocess command

    Constantly print Subprocess output while process is running

    1 回复  |  直到 6 年前
        1
  •  0
  •   mattbornski    6 年前

    我们绝对建议您拆分代币,您可能需要使用 shell=True 得到 sudo 采取:

       cmd_str="sudo shred -v /dev/sde"
       f="/test.log"
    
       with Popen(cmd_str.split(), shell=True, stdout=open(f, 'w'), bufsize=1, universal_newlines=True) as p:
           for line in p.stdout:
               print(line, end='')