【问题标题】:Storing stdout from an exec process into a variable将 exec 进程中的标准输出存储到变量中
【发布时间】:2020-11-08 13:19:13
【问题描述】:

我目前有以下代码,我使用os.execv() 来执行某种进程。例如:

process_param = [exec_path, f]
pid = os.fork(                      
try:
   if (pid > 0):
      #parent 
      time_lim = 55
      for _ in range(time_lim):
         child_pid, status = os.waitpid(-1, os.WNOHANG)

         if (child_pid != 0):
            break

         time.sleep(1)
        
   elif (pid == 0):
      os.execv(exec_path, process_param)
   else:
      status = 1
except ChildProcessError:
   status = 1

在你告诉我使用 subprocess 之前,请注意(出于分配目的),我应该坚持这种通过 Python 运行 bash 命令的特殊方法。

我想做类似的事情:

var_a=`cat some_file`

有谁知道我如何捕获来自os.execv() 命令的输出(位于子进程中)并将其存储在变量中(可能将其返回给父进程)?

【问题讨论】:

  • 您需要将新进程的标准输出文件句柄连接到读取它的父进程中的某个东西。正如您所注意到的,subprocess 已经为您完成了这项工作——也许可以看看它的实现作为示例。
  • 有人建议我使用 os.pipe()。但是,我不确定我是否理解它的实现。
  • 在类 Unix 系统上用 C 语言实现这一点应该不难找到;将构造映射到 Python os.* 调用应该很简单。

标签: python python-exec


【解决方案1】:

使用os.pipeos.dup2。您可以通过https://docs.python.org/3/library/os.html#os.dup2了解更多信息。

import os
import sys

r, w = os.pipe()
pid = os.fork()
if pid:
    # parent
    os.close(w)
    r = os.fdopen(r)
    print(r.read())
    sys.exit(0)
else:
    # child
    os.close(r)
    # duplicate stdout and stderr to parent
    os.dup2(w, 1)
    os.dup2(w, 2)
    os.execv('/usr/bin/ls', ['-l'])
    sys.exit(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2021-11-22
    • 2016-07-03
    • 1970-01-01
    • 2021-11-06
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多