【问题标题】:Differences between subprocess module, envoy, sarge and pexpect?subprocess 模块、envoy、sarge 和 pexpect 的区别?
【发布时间】:2012-06-08 00:32:00
【问题描述】:

我正在考虑制作一个需要从各种 aircrack-ng 套件工具发送输入和获取输出的程序。我知道一些 python 模块,例如 subprocess、envoy、sarge 和 pexpect,它们可以提供必要的功能。任何人都可以建议我应该使用或不使用什么,特别是因为我是 python 新手。

谢谢

【问题讨论】:

  • 我没有听说过这些库中的大多数,但总的来说,如果有一个标准模块可以满足我的所有需求,我会喜欢它而不是任何 3rd 方库。
  • 当您想要与进程进行双向通信时,您可能需要pexpect 而不是subprocess。其他两个库我不知道。

标签: python subprocess pexpect python-envoy


【解决方案1】:

作为sarge 的维护者,我可以告诉你,它的目标与envoy 大体相似(在易用性方面超过subprocess)并且sarge 中有(IMO)更多功能关于:

  • 跨平台支持类似 bash 的语法(例如,在命令行中使用 &&||&
  • 更好地支持捕获subprocess 输出流并异步处理它们
  • 更多文档,尤其是关于使用子进程的上下文中的线程+分叉等内部和外围问题
  • 支持防止 shell 注入攻击

当然是 YMMV,但您可以查看 the docs,它们相当全面。

【讨论】:

  • 测试 sarge vs envoy(我正在替换 pexpect 以向我的应用程序添加 windows 支持),我发现 envoy 使用 shlex。这导致不支持本机 windows 路径(shlex 删除“\”字符) .这可以通过在将路径传递给特使之前调用 as_posix() 来解决(使用 pathlib 时)。但是,sarge 可以开箱即用地使用 Windows 路径。
  • 不幸的是,Sarge 自 2018 年以来一直没有更新(现在大约两年过时),并且处于“测试”阶段。否则看起来很有希望!
  • @Andy 作为sarge 的维护者,我仍然在可行的情况下回复功能请求和错误报告 - 自 2018 年以来没有更新,因为它满足了我的需要,也没有错误报告或功能请求我可以进步。
  • @VinaySajip 听起来你不再认为是“测试版”。您愿意发布非测试版吗?
  • @Andy 于 2020 年 8 月 24 日发布:pypi.org/project/sarge/0.1.6
【解决方案2】:

期待

在 2015 年,pexpect 不适用于 Windows。传言要添加“实验性”支持in the next version,但这已经是谣言很久了(我没有屏住呼吸)。

使用 pexpect 编写了许多应用程序(并且喜欢它),我现在很抱歉,因为我喜欢 python 的一件事(它是跨平台的)不适用于我的应用程序。

如果您打算添加 Windows 支持,暂时避免使用 pexpect。

特使

去年活动不多。自 2012 年以来,很少有提交(总共 12 次)。对它的未来不太有希望。

在内部,它以与 Windows 路径不兼容的方式使用 shlex(命令必须使用“/”而不是“\”作为目录分隔符)。一种解决方法(使用 pathlib 时)是在路径对象上调用 as_posix(),然后再将它们作为命令传递。见this answer

访问内部流(即我想解析输出以获得一些更新滚动条),似乎可行,但没有记录。

萨格

在开箱即用的 Windows 上工作,并且有一个 expect() 方法,该方法应该提供类似于 pexpect 的功能(允许我更新滚动条)。最近的活动,但它托管在 gitlabbitbucket 上(非常混乱)。

个人结论

我正在 pexpect sarge 为未来的发展。似乎提供了与 pexpect 类似的功能集并支持 windows。

【讨论】:

  • 那么subprocess呢?它仍然有效,只是语法令人讨厌。它适用于所有平台,与其他一些平台不同。
【解决方案3】:

subprocess - 是一个标准库模块,因此可以通过 python 安装使用。但它有一个难以使用的名声,因为它的 api 不直观。

envoy - 是一个围绕子流程的第三方模块。它被编写为一个易于使用的替代子流程。特使 Kenneth Reitz 的作者以其Python for Humans 哲学而闻名。

我不熟悉其他两个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2015-09-29
    • 2017-08-28
    相关资源
    最近更新 更多