如果可能的话,如何使用 os.execv() 使用管道和重定向?

2024-01-02

我从用户那里获取命令和参数,解析它们并将它们传递给os.execvp(),像这样:

> ps -a -u -x

cmd = "ps"
args = ["-a", "-u", "-x"]
os.execvp(cmd, args)

问题是这不适用于管道或重定向,因此这样的方法不起作用:

> ps -a -u -x > output.txt

cmd = ps
args = ["-a", "-u", "-x", ">", "output.txt"]
os.execvp(cmd, args)

我明白我的问题是> and output.txt不是以下参数ps,我只是不知道解决这个问题的最佳方法。我希望我只是缺少正确的方法。


With os.execv我们处于操作系统的低级别。

要重定向输出,我们需要替换文件描述符 no。 1 (stdout) 在执行命令之前。

import os

STDOUT = 1

fdout = os.open('output.txt', os.O_WRONLY)
os.dup2(fdout, STDOUT)
os.execvp('ps', 'ps -a -u -x'.split())
# not reached
os._exit(127) # just for the case of execv failure

使用管道连接两个进程需要更多工作。管道有两端,必须首先创建。然后fork将重复该过程。每个进程必须关闭管道的一端,并将另一端分别重定向到其 stdin 或 stdout。

import os

STDIN = 0 
STDOUT = 1 

pipein, pipeout = os.pipe()
if os.fork():
    # parent
    os.close(pipeout)
    os.dup2(pipein, STDIN)
    os.execlp('wc', '-l')
    # not reached
    os._exit(127)
else:
    # child
    os.close(pipein)
    os.dup2(pipeout, STDOUT)
    os.execvp('ps', 'ps -a -u -x'.split())
    # not reached
    os._exit(127)

这些只是概念的示例。

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

如果可能的话,如何使用 os.execv() 使用管道和重定向? 的相关文章

随机推荐

  • Office 365 Rest API - 守护程序周身份验证

    我正在尝试建立一个Ruby用于访问 Office 365 Rest API 的守护程序服务 最近可以通过 OAuth client credentials 流程来做到这一点 如本博客文章所述 https learn microsoft co
  • 为没有 ZeroMQ 绑定的语言创建 IPython 的语言内核

    有some http andrew gibiansky com blog ipython ipython kernels 有趣的描述 https stackoverflow com questions 22782028 ipython la
  • OpenGL ES 2.0 中许多具有不同纹理的对象

    我是 OpenGL ES 2 0 的新手 它具有可编程管道 并且我正在移植使用不同纹理渲染许多对象的应用程序 那么这将需要为每个对象调用 glDrawArrays 并在调用之间更改纹理 或者还有另一种方法可以通过单个 glDrawArray
  • 沿着一列将 DataFrame 从长到宽重塑

    我正在寻找一种将下面的表 A 显示重新配置为表 B 的方法 Table A type x1 x2 x3 A 4 6 9 A 7 4 1 A 9 6 2 B 1 3 8 B 2 7 9 转化为表B type x1 x2 x3 x1 x2 x3
  • UTF-8 与 UTF-16 和 UTF-32 转换混淆

    我对将 unicode 字符转换为十六进制值感到有点困惑 我正在使用这个网站来获取字符的十六进制值 https www branah com unicode converter https www branah com unicode co
  • 如何授予自己对本地 SQL Server 实例的管理员访问权限?

    我将 SQL Server 2008 R2 安装到本地计算机上 但是 由于权限 或缺乏 我无法创建新数据库 创建数据库权限被拒绝 因此 我尝试将管理员权限分配给我当前的登录名 用户无权执行此操作 我还尝试创建一个具有管理员权限的新登录名 但
  • 在 macOS Mojave 上的 Mac App Store 中打开开发者页面

    新的 Mac App Store 提供了一个开发者页面 我想从我的应用程序中链接到此页面 怎么能做到这一点呢 我知道我可以打开单个应用程序 Mac App Store 甚至显示了 复制链接 选项 但开发人员页面没有此选项 这可能吗 我终于弄
  • Axios post 为对象添加额外的键

    我尝试用 axios 发布一个对象 我需要它的格式如下 var dataObj username username password password data1 data1 当我在后端使用 axios 和 catch 发布它时 它会向对象
  • 计算向量中每 n 个值的平均值

    假设我有一个向量 a lt rnorm 6000 我想计算第 1 个值到第 60 个值的平均值 然后再次计算第 61 个值到第 120 个值的平均值 依此类推第四个值 所以基本上我想计算每 60 个值的平均值 从而从该向量中得到 100 个
  • 在编辑器中保存然后刷新浏览器快捷方式命令

    我想要一个热键来在 Notepad 中保存全部 然后切换到浏览器并刷新页面 我每天必须这样做数千次 并执行 全部保存 热键 然后按 Alt Tab 到右侧窗口 然后按 F5 一次又一次地刷新 一定有更好的解决方案吗 如果有其他编辑器可以做到
  • Python将音频添加到视频opencv

    我使用 python cv2 模块将 jpg 帧加入视频中 但无法向其中添加音频 是否可以在没有 ffmpeg 的情况下在 python 中向视频添加音频 附 抱歉我的英语不好 使用ffpyplayer来处理音频部分 import cv2
  • Java 泛型的转换很奇怪[重复]

    这个问题在这里已经有答案了 我正在使用java 8 我最近遇到了这个 public class Test public static void main String args String ss Test
  • 如何修复或纠正 IntelliJ Idea 中的“默认文件模板”警告

    IntelliJ理念 2016 1 Windows 10 专业版 当我在新项目中创建新项目或新类时 IntelliJ 会帮助包含一个包含我的姓名和日期的默认标头 但是 它还会突出显示代码并显示有关使用 默认文件模板 的文件的警告 它建议了两
  • 如何禁用“href”属性的默认 行为?

    我有一个像这样的简单侧边栏 div class sidebar ul class nav li class Page1 a href Page1 html Page1 a li li class Page2 a href Page2 htm
  • 如何列出迄今为止正在使用或创建的所有 Hive 数据库?

    如同SHOW TABLES命令 我们是否有这样的命令来列出迄今为止创建的所有数据库 这一页 https cwiki apache org confluence display Hive LanguageManual DDL提到命令SHOW
  • Django 中的 GraphQL 查询返回 None

    我正在尝试在 django 中使用 graphQL 查询 基本上我有两个应用程序 一个是我的 api 应用程序 其中包含进行查询所需的所有内容 另一个是 前端 应用程序 我从中调用 api 来使用这些查询 我可以使用 GraphQL 视图在
  • 用于大型数组的 php in_array 的替代方案,以避免重复条目

    我需要生成一个从 600k 到 2000k 的大量随机数列表 但是 列表不能有重复项 我当前的 实现 如下所示
  • 最近 6 笔付款

    我需要从仅包含以下内容的模式中获取最后六笔付款 贡献 ID 到期日 数量 付款持续了 7 年 我只需要获取最新的最后六笔付款 我认为这会做到这一点 因为它遵循我的 sql SELECT TOP 6 ID customerInfo IVACO
  • MVC 5 + $Post() 函数在服务器上托管后不起作用

    我用MVC5开发了一个应用程序 调用下面代码中视图上的链接的 Onclick Code in View File post ControllerName FunctionName this is your url id image func
  • 如果可能的话,如何使用 os.execv() 使用管道和重定向?

    我从用户那里获取命令和参数 解析它们并将它们传递给os execvp 像这样 gt ps a u x cmd ps args a u x os execvp cmd args 问题是这不适用于管道或重定向 因此这样的方法不起作用 gt ps