【问题标题】:Start process without stdout output启动没有标准输出的进程
【发布时间】:2014-08-27 16:58:55
【问题描述】:

我正在使用 python 脚本作为引导程序来启动一个长时间运行的 java 服务。

call = [ "java", "-cp", ... ]

with open(os.devnull, 'w') as fnull:
    subprocess.Popen(call, stdout=fnull)
    print "Service started."

但是当 python 进程完成时,我仍然从 java 进程中获取 stdout 输出。我认为这是因为 python 关闭了我的fnull,所以它恢复到正常的标准输出。

我怎样才能实现我想要的?

编辑:顺便说一句,如果可能的话,最好仍然获得stderr,但如果它增加了任何复杂性,那就不行了。

EDIT2:看来我是个白痴,被写入的是stderr。

【问题讨论】:

  • 你确定你看到的是stdout而不是stderr
  • stdout 指向/dev/null,你看不到它。您的 java 进程可能正在向stderr 发送消息。
  • 一旦子进程分叉,父文件描述符发生什么都没有关系。孩子得到/dev/null。为标准错误假设投票。
  • 是的 - 我是个白痴,被写入的是 stderr。谢谢大家。

标签: python


【解决方案1】:

对旁注的部分回答,它很容易获得 stderr(当你想要 stdout 和 stderr 时它更复杂)。它还有一个额外的好处是它会告诉你你认为在 stdout 上的 java 输出是否真的在 stderr 上。

call = [ "java", "-cp", ... ]

with open(os.devnull, 'w') as fnull:
    subprocess.Popen(call, stdout=fnull, stderr=subprocess.PIPE)
    print "Service started."
for line in stderr:
    print 'stderr: ', line.strip()

【讨论】:

    【解决方案2】:

    如果你同意让 python 脚本运行

    Popen.communicate(input=None)

    与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件结尾。等待进程终止。可选的输入参数应该是一个要发送到子进程的字符串,或者 None,如果不应该向子进程发送数据。

    【讨论】:

    • communicate() 仅在 stdout 和 stderr 被定向到 popen.PIPE 时才捕获它们,这里不是这种情况。
    猜你喜欢
    • 2020-10-18
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多