我什么时候应该使用 subprocess.Popen 而不是 os.popen?

2023-12-21

似乎都执行一个子进程并创建一个管道来执行输入/输出,只是subprocess较新。

我的问题是,有没有什么功能可以subprocess.Popen可以做一会儿os.popen不能,所以我们需要新模块subprocess?

为什么Python语言没有选择增强os.popen但创建了一个新模块?


简短回答:永远不要使用os.popen,始终使用subprocess https://docs.python.org/3/library/subprocess.html!

从Python 2.7可以看出os.popen docs https://docs.python.org/2/library/os.html#os.popen:

自 2.6 版起已弃用:此函数已过时。使用subprocess模块。特别检查替换旧功能 与子流程 模块 https://docs.python.org/2/library/subprocess.html#subprocess-replacements部分。

旧版本存在各种限制和问题os.popen函数族。正如文档提到的,2.6 之前的版本在 Windows 上甚至都不可靠。

背后的动机subprocess解释于PEP 324 -- 子流程 - 新流程模块 https://www.python.org/dev/peps/pep-0324:

动机

启动新进程是任何编程语言中的常见任务, 在 Python 等高级语言中非常常见。良好的支持 需要执行此任务,因为:

  • 启动进程的不适当的函数可能意味着 安全风险:如果程序是通过shell启动的,并且 参数包含 shell 元字符,结果可以是 惨重。 [1]

  • 它使 Python 成为更好的替代语言 过于复杂的 shell 脚本。

目前,Python有大量不同的函数用于 流程创建。这让开发商难以选择。

子流程模块提供了以下增强功能 以前的功能:

  • 一个“统一”模块提供了以前的所有功能 功能。

  • 跨进程异常:子进程中发生的异常 在新进程开始执行之前被重新引发 家长。这意味着很容易处理 exec() 例如,失败。以 popen2 为例,它是 无法检测执行是否失败。

  • 用于在 fork 和 exec 之间执行自定义代码的挂钩。这 例如,可用于更改 uid。

  • 没有隐式调用 /bin/sh。这意味着没有必要 用于转义危险的 shell 元字符。

  • 文件描述符重定向的所有组合都是可能的。 例如,“python-dialog”[2]需要生成一个进程 并重定向 stderr,但不重定向 stdout。这是不可能的 当前功能,不使用临时文件。

  • 通过subprocess模块​​,可以控制是否全部打开 文件描述符应该在新程序运行之前关闭 被执行。

  • 支持连接多个子进程(shell“管道”)。

  • 通用换行符支持。

  • 一个communicate()方法,可以很容易地发送stdin数据 并读取 stdout 和 stderr 数据,而不会有死锁的风险。 大多数人都知道涉及的流量控制问题 孩子进行沟通,但并不是所有人都有耐心或 编写完全正确且无死锁的选择循环的技能。 这意味着许多Python应用程序都包含race 状况。标准库中的communicate()方法 解决了这个问题。

请参阅 PEP 链接了解基本原理和更多详细信息。

除了安全性和可靠性问题之外,恕我直言,旧的os.popen家庭是繁琐和混乱的。在编码时如果不仔细参考文档,几乎不可能正确使用。相比下,subprocess是天赐之物,尽管在使用它时参考文档仍然是明智的。 ;)

有时,人们会推荐使用os.popen而不是subprocess.Popen在Python 2.7中,例如Python 子进程与 os.popen 开销 http://essays.ajs.com/2011/02/python-subprocess-vs-ospopen-overhead.html因为它更快。当然,它更快,但那是因为它没有做各种对于保证其安全工作至关重要的事情!


FWIW, os.popen它本身仍然存在于 Python 3 中 https://docs.python.org/3/library/os.html#os.popen,但是它是通过以下方式安全实现的subprocess.Popen,所以你不妨只使用subprocess.Popen直接你自己。该委员会的其他成员os.popenPython 3 中不再存在族。os.spawnPython 3 中仍然存在一系列函数,但文档建议使用由subprocess可以使用模块来代替。

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

我什么时候应该使用 subprocess.Popen 而不是 os.popen? 的相关文章

  • 如何避免使用 python 处理空的标准输入?

    The sys stdin readline 返回之前等待 EOF 或新行 所以如果我有控制台输入 readline 等待用户输入 相反 我想打印帮助并在没有需要处理的情况下退出并显示错误 而不是等待用户输入 原因 我正在寻找一个Pytho
  • Python 切片对象和 __getitem__

    python 中是否有内部的东西来处理传递给的参数 getitem 不同 并自动转换start stop step构造成切片 这是我的意思的演示 class ExampleClass object def getitem self args
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 如何通过 python 多处理利用所有核心

    我一直在摆弄Python的multiprocessing现在已经使用了一个多小时的功能 尝试使用并行化相当复杂的图形遍历函数multiprocessing Process and multiprocessing Manager import
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 使用 Paramiko 进行 DSA 密钥转发?

    我正在使用 Paramiko 在远程服务器上执行 bash 脚本 在其中一些脚本中 存在与其他服务器的 ssh 连接 如果我只使用 bash 不使用 Python 我的 DSA 密钥将被第一个远程服务器上的 bash 脚本转发并使用 以连接
  • Arcpy 模数在 Pycharm 中不显示

    如何将 Arcpy 集成到 Pycharm 中 我尝试通过导入模块但它没有显示 我确实知道该模块仅适用于 2 x python arcpy 在 PyPi Python 包索引 上不可用 因此无法通过 pip 安装 要使用 arcpy 您需要
  • python 中的 <> 运算符有什么作用?

    我刚刚遇到这个here http www feedparser org feedparser py 总是这样使用 if string1 find string2 lt gt 1 pass 什么是 lt gt 运算符这样做 为什么不使用通常的
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 如何在亚马逊 EC2 上调试 python 网站?

    我是网络开发新手 这可能是一个愚蠢的问题 但我找不到可以帮助我的确切答案或教程 我工作的公司的网站 用 python django 构建 托管在亚马逊 EC2 上 我想知道从哪里开始调试这个生产站点并检查存储在那里的日志和数据库 我有帐户信
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • Pandas 数据框按日期移动列

    我有一个按日期和 ID 索引的面板数据集 看起来像这样 df pd DataFrame Date 2005 12 31 2006 03 31 2006 09 30 2005 12 31 2006 03 31 2006 06 30 2006
  • 绕过错误并继续代码

    这是我之前遇到的一个简单问题 本质上 像这样的解决方案 https stackoverflow com questions 574730 python how to ignore an exception and proceed and t
  • 在 Android 上替换 ViewPager 中的当前 Fragment

    我有一个ViewPager我必须更换第一个Fragment如果某个动作发生 public static class PagerAdapter extends FragmentStatePagerAdapter private TempCha
  • 如何添加可拖动的“文本字段”以在颤振中的图像上添加文本?

    我正在 flutter 中创建一个 Meme 生成器应用程序 我只需要知道是否有一种方法 用户本身可以在图像上添加文本并将该文本拖动到图像区域中的任何位置 这样图片看起来很有趣 我尝试过拖动框小部件 但不知道如何将其用于文本字段 这样我也可
  • SQL 2008+ NOLOCK 与 READPAST 对于报告准确性的注意事项

    了解最终的决策是业务决策 在 SQL 2008 R2 中运行的 NOLOCK 和 READPAST 之间的准确性考虑因素是什么 在与业务领域讨论变更之前 我希望能有更好的理解 我继承了许多查询 用于创建管理报告的数据视图 WITH NOLO
  • iPhone:获取 Google 地图的选定缩放级别

    当用户使用以下任一方式时 我们需要获取 MKMapView 当前选择的缩放级别 使用 Mapkit 放大或缩小 Google 地图 我们尝试过的解决方案在模拟器上运行良好 但在真实环境中运行不佳 设备 具有 iOS 3 0 1 的 iPho
  • 将 NLTK Rake 应用于 Dataframe 中的每一行

    我想应用 Rake 函数 https pypi org project rake nltk https pypi org project rake nltk 到我的数据框中的每一行 我可以将该函数单独应用于特定行 但不能将其附加到数据帧 这
  • Solr 索引中缺少 Id 字段

    我刚刚发现我的 Solr 索引不包含 id场地 并且无法获取项目 id UniqueId 存在 但这并不是真正有用 public class MyClass IndexField BuiltinFields UniqueId public
  • 在二叉搜索树中查找最小和的算法改进

    我编写了以下函数来找出二叉搜索树中任何路径的最小总和 int minSumPath TreeNode root if root NULL return 0 int sum root gt value if root gt left NULL
  • 存储 API URL 并在 Angular 中使用的最佳方式是什么

    我想将所有 API URL 存储在一个位置 即在 JSON 文件中 我想在我的应用程序中使用该 JSON 文件 i 保存 JSON 文件的最佳位置是哪里 ii 如何使用 Type 脚本文件中的 URL 我会将基本网址存储在environme
  • Elasticsearch 重新索引现有类型映射中的项目

    我向类型映射添加了一个新属性 我需要重新索引该类型的所有现有项目才能使用新属性 我应该使用哪个 API 来执行此操作 如果您要添加索引中以前从未存在过的新字段 则无需重新索引 只需使用 PUT 映射 API 添加新字段http nocf w
  • 配置 ActiveStorage 以使用具有 IAM 角色的 S3

    我正在尝试配置 ActiveStorage 以使用 S3 存储桶作为存储后端 但我不想传递任何access key id secret access key region 相反 我想使用之前定义的 IAM 角色 提到了这样的配置here h
  • C++11 具有重要成员的匿名联合

    我正在更新我的一个结构 我想向其中添加一个 std string 成员 原始结构如下所示 struct Value uint64 t lastUpdated union uint64 t ui int64 t i float f bool
  • 在 Visual Studio 中逐步完成“托管到本机转换”?

    在试图回答的同时这个问题 https stackoverflow com questions 9378626我决定需要在调试器视图中手动单步执行编组过程 不幸的是 Visual Studio 似乎直接跳过了所有这些有趣的代码 这是 P In
  • 如果我想将 Play Framework 应用部署到多台服务器上,该怎么办?

    如果我想使用 Play Framework 2 x 将应用程序部署到多个服务器 我需要关心哪些事情 如果我使用 内置 会话 它是否可用于所有节点 因为它们存储在浏览器端 除了将变量存储在数据库中之外 如何在应用程序范围内共享变量 当将 Pl
  • 如何在for循环内进行同步延迟?

    我正在编写一个 NodeJS 脚本 它通过 GET 调用一堆 API 使用request来自 npm 并将响应保存在 JSON 文件中 我正在使用一个for循环遍历ID以传递给API 但是我在调 用突发之间设置延迟时遇到了麻烦 这样我就不会
  • 带文本的球形动画,用于在 Android 应用程序中使用标签云 [新闻共和国]

    我想在我的 Android 应用程序中创建类似于 in app 我尝试过创建一个sphere http www programering com a MDM3cjNwATU html到目前为止 但任何人都可以指导我如何继续在 android
  • 通过 WMI 查询对远程计算机上 UNC 路径的访问

    我想查明远程主机是否具有对网络共享的读写访问权限 首先 我想看看是否可以查询目标主机查询 UNC 路径信息的能力 ala var query string Format select from CIM Directory where nam
  • 验证和更改用户密码

    我有一个简单的 C Windows 窗体 它充当登录名 但也有一个用于更改用户密码的窗体 当您单击 更改密码 时 表单会加载一个文本框 其中包含当前密码 新密码和确认新密码以及一个保存按钮 我已将用户名存储在标签中 以便可以检查当前密码是否
  • 我什么时候应该使用 subprocess.Popen 而不是 os.popen?

    似乎都执行一个子进程并创建一个管道来执行输入 输出 只是subprocess较新 我的问题是 有没有什么功能可以subprocess Popen可以做一会儿os popen不能 所以我们需要新模块subprocess 为什么Python语言