【问题标题】:Preserving bash redirection in a python subprocess在 python 子进程中保留 bash 重定向
【发布时间】:2012-10-18 17:23:34
【问题描述】:

首先,我只能使用 python 2.4.4

我需要在 python 中编写一个进程控制器,它启动并且各种子进程监视它们如何影响环境。这些子进程中的每一个本身都是 python 脚本。

从 unix shell 执行时,命令行如下所示:

python myscript arg1 arg2 arg3 >output.log 2>err.log &

我对输入或输出不感兴趣,python不需要处理。 python程序只需要知道 1)每个进程的pid 2)每个进程是否正在运行。

并且这些进程连续运行。

我曾尝试读取输出并再次将其发送出一个文件,但随后我遇到了 readline 不是异步的问题,对此有几个答案,其中很多都非常复杂。

如何制定一个保留 bash 重定向操作的 python 子进程调用?

谢谢

【问题讨论】:

    标签: python redirect subprocess


    【解决方案1】:

    如果我正确理解您的问题,听起来您在这里寻找的是能够启动脚本列表并将输出重定向到文件。在这种情况下,启动每个任务,如下所示:

    task = subprocess.Popen(['python', 'myscript', 'arg1', 'arg2', 'arg3'],
        stdout=open('output.log', 'w'), stderr=open('err.log', 'w'))
    

    这样做意味着子进程的 stdout 和 stderr 被重定向到监视进程打开的文件,但监视进程不必参与复制数据。如果需要,您也可以重定向子流程标准输入。

    请注意,您可能希望处理本示例中未处理的错误情况等。

    【讨论】:

    • 谢谢,这是我采用的方法。我仍然有点困惑的唯一问题是这个模块的文档。例如,这似乎表明标准输出的唯一有效选项是 PIPE 或 STDOUT。没有文档说我可以使用任何文件描述符。
    • 来自docs:“stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPE,一个现有的文件描述符(一个正整数)、现有文件对象和无。"和“此外,stderr 可以是 STDOUT”。
    【解决方案2】:

    您可以使用现有文件描述符作为 subprocess.Popen 的 stdout/stderr 参数。这应该等同于从 bash 重定向运行。该重定向是在 fork 之后使用 fdup(2) 实现的,并且输出不应触及您的程序。您可能还可以将 fopen('/dev/null') 作为文件描述符传递。

    或者,您可以重定向控制器程序的 stdout/stderr 并将 None 作为 stdout/stderr 传递。孩子们应该打印到您的控制器 stdout/stderr 而不通过 python 本身。这是因为子进程将继承控制器的标准输入/标准输出描述符,这些描述符在启动时由 bash 重定向。

    【讨论】:

      【解决方案3】:

      子流程模块不错。

      您也可以在 *ix 上使用 os.fork() 和周期性 os.wait() 使用 WNOHANG。

      【讨论】:

        猜你喜欢
        • 2011-11-16
        • 1970-01-01
        • 2020-06-02
        • 2021-03-25
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        相关资源
        最近更新 更多