Python:fork、pipe 和 exec

2023-11-26

我想在Python应用程序中执行一个程序,它将在后台运行,但最终会来到前台。

GUI 用于与其交互。但控制是通过标准输入和标准输出上的控制台提供的。我希望能够使用我的应用程序的 GUI 来控制它,所以我的第一个想法是:

  • Fork
  • 在父级中,dup2 stdin 和 stdout 以便访问它们
  • 执行孩子

这在 python 中很容易实现吗?如何实现?有没有其他方法可以实现我想要的目标,那会是什么?


首先是蟒蛇子流程模块是正确的答案。

作为子流程示例:

import subprocess
x = subprocess.check_output(["echo","one","two","three"])

其中 x 将是输出(python3 字节类:x.decode('utf-8')对于字符串)

请注意,这不会重复 stderr。如果您还需要 stderr,您可以执行以下操作:

x = subprocess.check_output(["bash","-c", 'echo foo; echo bar >&2'],stderr=subprocess.STDOUT)

当然,还有许多其他方法来捕获 stderr,包括捕获到不同的输出变量。

使用直接控制

但是,如果您正在做一些棘手的事情并且需要直接控制,请检查下面的代码:

import os
rside, wside = os.pipe()
if not os.fork():
    # Child

    os.close(rside)
    # Make stdout go to parent
    os.dup2(wside, 1)
    # Make stderr go to parent
    os.dup2(wside, 2)
    # Optionally make stdin come from nowhere
    devnull = os.open("/dev/null", os.O_RDONLY)
    os.dup2(devnull, 0)
    # Execute the desired program
    os.execve("/bin/bash",["/bin/bash","-c","echo stdout; echo stderr >&2"],os.environ)
    print("Failed to exec program!")
    sys.exit(1)

# Parent
os.close(wside)
pyrside = os.fdopen(rside)

for line in pyrside:
   print("Child (stdout or stderr) said: <%s>"%line)

# Prevent zombies!  Reap the child after exit
pid, status = os.waitpid(-1, 0)
print("Child exited: pid %d returned %d"%(pid,status))

Note: @初学者的回答在几个方面存在缺陷:包含了 os._exit(0) ,它立即导致子进程退出,使其他一切变得毫无意义。没有 os.execve() 使得问题的主要目标毫无意义。无法访问孩子的标准输出/标准错误作为另一个问题目标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:fork、pipe 和 exec 的相关文章

随机推荐

  • Notepad++ 正则表达式 -> newLine

    我使用 Notepad 我需要删除以 abc 开头的所有行 注意 我不需要将以 abc 开头的行替换为空行 但我需要完全删除这些行 我该如何继续 我想使用正则表达式 尝试更换 abc r n with nothing The 表示一行的开始
  • jQuery 动画回到原始位置

    我正在开发一个网站 其中有一些绝对定位的 div 我需要在单击时调整其大小 然后这些将填充 div 所在的容器 问题是如何让它们切换到去返回到原始位置 顶部 左侧 每个位置都不同 work item toggle toggle functi
  • 单例或类方法[重复]

    这个问题在这里已经有答案了 阅读完对某个问题的回复后question关于 Objective C 中的单例 似乎每个解决方案都在实例访问器中的线程方面做出了一些权衡 IE synchronized self if sharedInstanc
  • 不在对象上下文中时使用 $this - Laravel 4 PHP 5.4.12

    我试图使用变量 this 访问构造函数上的实例 在所有其他方法中 当我打电话时似乎效果很好 this gt event gt method 但在这个方法上它给我一个错误 不在对象上下文中时使用 this 我刚刚对这个问题进行了研究 我发现的
  • Java TLS 套接字:找不到受信任的证书

    让我快速解释一下我想要做什么 我正在尝试用 java 构建我自己的 Apple 推送通知服务 用于测试目的 该服务的工作得益于 TLS 套接字 我有一个 java 客户端来创建 TLS 套接字以向 APN 发送推送通知 我更改了主机 url
  • OUTER JOIN 结果缺少行,没有 WHERE 子句(已找到解决方法)

    更新在底部 我正在尝试执行自外连接 对于每个记录 返回它以及晚于它发生的所有其他记录 如果它本身是最新记录 则返回 NULL 这是我的sql代码 SELECT A CR A REGIS STATUSDATE B REGIS STATUSDA
  • 应用程序在 runTransitionForCurrentState 上崩溃,但不知道为什么

    我尝试过寻找这个 但没有运气 所以希望有一些大师可能知道答案 我在 iTunes Connect 中看到大量关于我的应用程序因特定堆栈跟踪而崩溃的报告 但堆栈跟踪没有显示任何有用的信息 0 Crashed main 0 UIKit 0x18
  • Hibernate 验证“无法初始化 javax.el.E​​xpressionFactory”错误

    我正在尝试使用休眠验证 代码可以编译 但是启动时失败并出现错误 Exception in thread main javax validation ValidationException HV000183 Unable to initial
  • Typescript 中的 React-Redux 连接问题

    我正在尝试制作一个传递给react redux的组件connect功能 组件如下 interface ITestProps id number class TestComponent extends React Component
  • 右边框渐变

    我正在尝试制作右边框 ul 元素为线性渐变 我尝试过以下但没有成功 webkit border image webkit linear gradient top FE2EF7 4AC0F2 0 0 5px 我正在使用 Chrome 非常感谢
  • C - “char var[]”和“char *var”之间的区别?

    我期望以下两个向量在 RAM 中具有相同的表示形式 char a var XXX x00 char p var XXX 但奇怪的是 调用类型的库函数f char argument 如果我使用以下方式调用它 则会破坏正在运行的应用程序f p
  • 如何在 PostgreSQL 中使用 RETURNING 和 ON CONFLICT?

    我在 PostgreSQL 9 5 中有以下 UPSERT INSERT INTO chats user contact name VALUES 1 2 3 2 1 NULL ON CONFLICT user contact DO NOTH
  • WinRT XAML 中 GridView 项目组内的垂直滚动

    我正在使用 GridView 在 WinRT XAML 应用程序中显示不同组的项目 一切都运行良好 除了 ItemsPanelTemplate 使用环绕网格 当空间不足时它会垂直堆叠我的项目 所以 我尝试使用 StackPanel 如下所示
  • Python 日志记录模块发出错误的时区信息

    我遇到了 Python 2 7 日志记录模块的问题 我的系统是Ubuntu 14 04 64bit 我住在意大利 目前UTC 1 无夏令时 系统已正确配置 我想在当前时区发出日志行 并包含正确的时区偏移信息 考虑以下片段 usr bin e
  • 如何使用 sscanf 解析逗号分隔字符串中的字段,同时支持空字段?

    我有一个逗号分隔的字符串 其中可能包含空字段 例如 1 2 4 使用基本的 sscanf string val1 val2 val3 val4 我获得了空字段之前的所有值 以及从空字段开始的意外结果 当我从 sscanf 中删除空字段的表达
  • 如何找出谁运行了 TFS 销毁命令?

    我有理由相信 TFS Destroy 命令在我的服务器上运行 TFS 是否提供了一种方法来查明是谁以及何时完成的 TFS 将所有用户启动的命令记录在数据库中 14 天 尝试连接到您的Tfs Collection数据库并运行以下查询 SELE
  • 修复了与 css 转换结合使用时附件背景图像在 chrome 中闪烁/消失的问题

    我目前正在做一个视差网站主题 背景图像需要固定地附加到某些 div 和 section 以避免 jquery 沉迷于一切 问题是在转换完成时 任何动画项目下方标签的背景图像都会消失 仅在 Google Chrome 上 补救 这是一个非常常
  • 使用 Ant 从命令行编译 NetBeans 项目

    我有一个 NetBeans 项目 想从命令行编译 StackOverflow 上还有许多其他关于如何执行此操作的问题 但它们解释了如何使用以下命令来编译项目javac src java 我没有更改 NetBeans 项目的构建设置 默认情况
  • 将 Oracle 10g CLOB 与 Grails 2.0.1 结合使用

    我正在开发一个使用 Oracle 10g 和 Grails v2 0 1 的项目 我尝试在 Domain 类中使用 CLOB 数据类型作为文本输入字段 但它似乎不起作用 我的第一次尝试是基于我读到的内容关于 GORM 这里 其中说要使用ty
  • Python:fork、pipe 和 exec

    我想在Python应用程序中执行一个程序 它将在后台运行 但最终会来到前台 GUI 用于与其交互 但控制是通过标准输入和标准输出上的控制台提供的 我希望能够使用我的应用程序的 GUI 来控制它 所以我的第一个想法是 Fork 在父级中 du