当前位置: 首页 > 面试题库 >

将stdout从subprocess.Popen保存到文件,以及将更多内容写入文件

傅正豪
2023-03-14
问题内容

我正在编写一个使用subprocess.Popen的python脚本,以执行两个程序(来自已编译的C代码),每个程序都生成stdout。该脚本获取该输出并将其保存到文件中。因为有时输出的大小足以淹没subprocess.PIPE,导致脚本挂起,所以我将stdout直接发送到日志文件。我想让我的脚本在文件的开头和结尾以及两个subprocess.Popen调用之间写入一些内容。但是,当我查看日志文件时,从脚本写入日志文件的所有内容都放在文件的顶部,然后是所有可执行的stdout。如何将添加的文本插入文件中?

def run(cmd, logfile):
    p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
    return p

def runTest(path, flags, name):
    log = open(name, "w")
    print >> log, "Calling executable A"
    a_ret = run(path + "executable_a_name" + flags, log)
    print >> log, "Calling executable B"
    b_ret = run(path + "executable_b_name" + flags, log)
    print >> log, "More stuff"
    log.close()

日志文件包含:调用可执行文件A调用可执行文件B更多内容[…两个可执行文件的标准输出…]

例如,是否有一种方法可以在调用Popen之后将A的stdout刷新到日志中?可能还有另一件事:可执行文件A开始,然后挂在B上,在B打印完内容并完成后,A然后打印更多内容并完成。

我在RHE Linux上使用Python 2.4。


问题答案:

您可以在每个Popen对象上调用.wait()以确保它已完成,然后调用log.flush()。也许是这样的:

def run(cmd, logfile):
    p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
    ret_code = p.wait()
    logfile.flush()
    return ret_code

如果需要在外部函数中与Popen对象进行交互,则可以将.wait()调用移到那里。



 类似资料:
  • 问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至:

  • 问题内容: 我需要使用启动多个长时间运行的进程,并希望将和从每个自动传送到单独的日志文件。每个进程将同时运行几分钟,并且我希望在进程运行时将 每个进程* 写入两个日志文件(和)。 * 我需要不断地调用,以便更新每个日志文件上的每个进程在循环,或者是有一些方法来调用原有的命令,以便和自动传输到打开的文件句柄? 问题答案: 根据文档, stdin,stdout和stderr分别指定执行程序的标准输入,

  • 问题内容: 我想将变量(这里称为)的内容复制到文件中。 文件名存储在另一个变量中。 我在执行此操作时遇到问题。这是我尝试过的: 我还用dd命令尝试了相同的操作…显然,shell认为这是指目录,因此告诉我找不到该目录。 我该如何解决? 问题答案: 使用命令: 代表文件的测试。 截断文件后,追加文本。如果只想将文本附加到文件的现有内容中,请改用: 该命令用于复制文件(到文件),而不用于将文本写入文件。

  • 问题内容: 我有这样的熊猫DataFrame 我想将此数据写入如下所示的文本文件: 我已经尝试过类似的东西 但它不起作用。这该怎么做? 问题答案: 您可以只使用和访问np属性: 产量: 或: 请注意,您必须传递通过追加模式创建的文件句柄。

  • 问题内容: 我的hangman程序有问题。我真的认为我需要做的事超出了我对Java的了解。这是我的代码 我能够使程序读取文件,然后打印到屏幕上,但是我不知道如何将文件中的单词存储到数组中。我一点都没有进步,所以请尝试并做到透彻。 问题答案: 您需要将读取的行保存在一个对象中,并将其分配给数组的某个字段。例如: 这会将值赋给数组的第一个字段。

  • 我正在编写一个文件编写器,它将ID和名称(这两个字符串)写入文本文件。这需要用户输入,然后将数据存储在txt文件中。但是,当我再次运行它时,任何新数据都会覆盖以前的数据,因此数据永远不会保存到txt文件中。 谁能告诉我如何保存这些数据,以便添加的任何新数据都存储在下一行,而不覆盖上一行? 谢啦