【问题标题】:start detached infinite process with python on windows and pipe the output into a file在 Windows 上使用 python 启动分离的无限进程并将输出通过管道传输到文件中
【发布时间】:2019-06-03 08:02:49
【问题描述】:

我正在尝试使用 python 启动一个无限运行的进程,并将它的输出通过管道传输到一个文件中。在 python 可执行文件退出后,新创建的进程应该继续运行。 当 python 使用此代码退出时,我能够启动一个进程并使其保持运行:

subprocess.Popen(command_list, creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_BREAKAWAY_FROM_JOB)

现在我正在尝试将已启动进程的输出通过管道传输到一个文件中,但我无法让它与分离进程一起工作。

关于如何实现这一目标的任何建议?

请注意,我正在尝试在 Windows 上实现这一目标。

【问题讨论】:

    标签: python python-3.x windows subprocess


    【解决方案1】:

    您是否尝试过将 stderrstdout 重定向到两个文件:

    from subprocess import Popen
    
    from subprocess import DEVNULL
    from subprocess import DETACHED_PROCESS
    from subprocess import CREATE_NEW_PROCESS_GROUP
    from subprocess import CREATE_BREAKAWAY_FROM_JOB
    
    command_list = ...
    
    creationflags = DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP | CREATE_BREAKAWAY_FROM_JOB
    
    with open("stderr.txt", mode="wb") as out, open("stdout.txt", mode="wb") as err:
        Popen(command_list, creationflags=creationflags, stdin=DEVNULL, stdout=out, stderr=err)
    

    请务必检查stderr.txtstdout.txt,因为您的进程的输出可能会重定向到其中任何一个。

    【讨论】:

    • CREATE_NEW_PROCESS_GROUPDETACHED_PROCESS 结合使用时几乎毫无意义(即不继承或分配控制台)。它所指的组是控制台进程组,因为控制台是唯一使用它的系统组件,并且仅作为GenerateConsoleCtrlEvent 的过滤器。
    • 我强烈建议在使用DETACHED_PROCESS 时将所有标准句柄覆盖为有效的文件句柄,因为如果标准句柄无效,某些控制台应用程序将失败。设置stdin=subprocess.DEVNULL
    • 顺便说一句,对于任何将来会关注此问题的人来说,stderr 和 stdout 文件命名以及它们的管道传输位置都混合在一起。 @RoadRunner
    • @DavidLichterov 我在 Windows 上进行测试,大多数时候实际输出通过管道传输到 stderr.txt。一定是 Windows 的问题,因为在 linux 上它会通过管道传输到 stdout.txt。
    • @RoadRunner 我认为这取决于您正在运行什么进程。我正在运行 qemu,它的输出正确输出到标准输出。任何方式这都会让人感到困惑。
    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2014-04-08
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多