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

无法从控制台捕获新行并将其保存到文本文件中

  •  0
  • user366312  · 技术社区  · 3 年前

    下面的源代码将捕获控制台的输出,并将其保存到文本文件中。

    import sys
    import subprocess
    sys.stdout = open("my_app.txt", "w")
    print(subprocess.check_output(
            ['./my_app', 
            '-length=7', 
            '-all', 
            '-file_names=tmpl.txt']        
            ), 
          '\n'
        )
    sys.stdout.close()
    

    上述源代码预计将输出以下输出:

    1a62  A    4 THR H CCHHHHH 7.042 5.781 5.399 5.373 5.423  -9.118     
    1a62  A    5 GLU H CHHHHHC 5.781 5.399 5.373 5.423 5.247   5.488   
    1a62  A    6 LEU H HHHHHCC 5.399 5.373 5.423 5.247 5.485   5.166  
    

    然而,我得到了以下输出:

    1a62  A    4 THR H CCHHHHH 7.042 5.781 5.399 5.373 5.423  -9.118\n1a62  A    5 GLU H CHHHHHC 5.781 5.399 5.373 5.423 5.247   5.488\n1a62  A    6 LEU H HHHHHCC 5.399 5.373 5.423 5.247 5.485   5.166  
    

    换句话说,新台词 stdout 未被正确识别/捕获/分析。

    我如何解决这个问题?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Yevgeniy Kosmak    3 年前

    从…起 docs :

    对于 stdin ,行尾字符 '\n' 在输入中将转换为默认的行分隔符 os.linesep 对于 stdout stderr ,输出中的所有行尾将转换为“\n”。有关更多信息,请参阅 io.TextIOWrapper 当其构造函数的换行符参数为 None .

    既然你应该加上 text=True 参数,如果您使用的是Python 3.7+, universal_newlines=True 其他的 Docs .

    print(subprocess.check_output([
        './my_app',
        '-length=7',
        '-all',
        '-file_names=tmpl.txt'
    ], text=True),
        '\n'
    )