【问题标题】:python: run external program and direct output to file and wait for finishpython:运行外部程序并将输出重定向到文件并等待完成
【发布时间】:2016-04-19 20:42:22
【问题描述】:

我想从 python 运行一个外部程序,将输出(大量文本)重定向到日志文件并等待该程序完成。我知道我可以通过 bash 做到这一点:

#! /bin/bash
my_external_program > log_file 2>&1
echo "done"

但是我怎样才能对 python 做同样的事情呢?请注意,使用 bash 命令,我可以在程序运行时检查 log_file。我也想要python中的这个属性。

【问题讨论】:

    标签: python bash logging


    【解决方案1】:

    请参阅subprocess 模块。

    对于example

    with open("log_file", "w") as log_file:
        subprocess.run(["my_external_program"], stdout=log_file, stderr=log_file)
    print("done")
    

    【讨论】:

    • +1。 python 子进程的绝佳解决方案,但我选择@Marco 解决方案,因为它更短(尽管据说 os.system 已被弃用)。
    • os.system() 的主要问题是安全性。现在,它与subprocess.run('...', shell=True) 也是多余的。传递给它的字符串被传递给 shell 进行解释。 (因此它与您发布的 bash 脚本完全相同)如果您对整个字符串进行硬编码,可以,但是如果您从某个地方获取数据来构造字符串,您可能正在执行您不想要的代码! (仅供参考)
    【解决方案2】:

    Controlling a python script from another script

    您可以查看上面的链接,确实是类似的问题。使用来自子进程或 os.popen 的 Popen 可以实时检查。

    用一个简单的os.system(“你的脚本> /tmp/mickey.log”)也会运行脚本,但它会等待之前的命令执行。

    如果这能解决您的问题,请告诉我。

    【讨论】:

    • 如何将 stderr 也重定向到日志文件?当我尝试 os.system("my_script &> my_log") 时,它不会创建任何日志文件,而是将所有内容都扔到 python 终端。
    • 在 bash 脚本中使用 2>&1 会将 sterr 重定向到您发送到我的日志的标准输出。例如: script.py 2>&1 > mickey.log 我认为这将解决您的查询 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2021-06-10
    • 2013-12-02
    • 2015-09-29
    • 2011-03-08
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多