Python 子进程 .check_call 与 .check_output

2023-11-30

我的 python 脚本(python 3.4.3)通过子进程调用 bash 脚本:

import subprocess as sp
res = sp.check_output("bashscript", shell=True)

The bash脚本包含以下行:

ssh -MNf somehost

它打开到某个远程主机的共享主连接以允许一些后续操作。

执行python脚本时,会提示输入密码ssh行,但在输入密码后它会阻塞并且永远不会返回。当我按 ctrl-C 终止脚本时,我看到连接已正确建立(因此ssh行已成功执行)。

我使用的时候没有出现这个阻塞问题check_call代替check_output, but check_call不检索标准输出。我想了解到底是什么导致了阻塞行为check_output,可能与一些微妙之处有关ssh -MNf.


check_call()尽快返回/bin/sh进程退出而不等待后代进程(假设shell=True就像你的情况一样)。

check_output()等待直到读取所有输出。如果ssh然后继承管道check_output()将等待直到它退出(直到它关闭其继承的管道末端)。

check_call()代码示例:

#!/usr/bin/env python
import subprocess
import sys
import time

start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' &"
subprocess.check_call(cmd, shell=True)
assert (time.time() - start) < 1

未读取输出;check_call()立即返回,无需等待孙子后台python进程。

check_call()只是Popen().wait(). Popen()启动外部进程并立即返回,无需等待其退出。.wait()收集进程的退出状态——它不等待其他(孙子)进程。

如果读取输出(它被重定向并且孙子 python 进程继承了 stdout 管道):

start = time.time()
subprocess.check_output(cmd, shell=True)
assert (time.time() - start) > 2

然后它会等待,直到继承管道的后台python进程退出。

check_output() calls Popen().communicate(),得到输出。.communicate() calls .wait()内部即check_output()还等待 shell 退出并check_output()等待EOF。

如果孙子没有继承管道那么check_output()不等待它:

start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' >/dev/null &"
subprocess.check_output(cmd, shell=True)
assert (time.time() - start) < 1

孙子的输出被重定向到/dev/null即,它不继承父级的管道,因此check_output()可以不等待就退出。

Note: &最后将孙子 python 进程置于后台。它不能在 Windows 上运行shell=True starts cmd.exe默认情况下。

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

Python 子进程 .check_call 与 .check_output 的相关文章

随机推荐

  • 使用 PDFBOX 输入阿拉伯字符[重复]

    这个问题在这里已经有答案了 Update 1 我正在尝试使用 pdfbox 在 pdf 文档中写入一些阿拉伯字符 结果我得到了一些奇怪的字符 您可以在下面找到我用于测试的代码片段 请注意 使用相同的代码来打印拉丁字符没有任何问题 publi
  • 如何在分部类的另一半中定义的属性上使用属性?

    我有一个通过导入包含以下内容 缩写 的 Web 服务自动生成的类 System Runtime Serialization DataMemberAttribute public System DateTime StartDate get r
  • Javascript在空格或引号上分割字符串到数组

    var str single words fixed string of words var astr str split need fix 我希望数组是这样的 var astr single words fixed string of w
  • 如何在 Outlook (2010) 全局地址列表中搜索姓名?

    我有一份名单 其中一些完整 一些被截断 我想在 Outlook 地址列表中搜索这些名称的匹配项 我最接近的是这个Python代码来自 ActiveState 代码 但它不搜索全局地址 只搜索我的 本地 列表 其中有3个地址 这显然是不对的
  • 用mockito测试Riverpod的正确方法是什么

    用mockito测试Riverpod的正确方法是什么 运行上面的代码 edited snippets from production side not important skip to the TEST below this seems
  • iOS 中如何强制视图进入横向?

    我在 SO 上看到了十几个可能的相关问题 但似乎没有一个是重复的 如何在viewdidload中强制视图旋转为横向 强制横向 ios 7 IOS 如何强制视图为横向 强制横向一个视图控制器 ios iOS 强制横向方向 如何使应用程序在 i
  • AOSP 非显而易见的 syscall() 实现

    据我所知 Linux ABI for ARM 声明系统调用返回值是通过r0如果它是负数 则应将其作为 errno 值取反进行线程化 即系统调用最终出现了一些错误 AOSP这个检查吗以某种奇特的方式 ENTRY syscall mov ip
  • Excel公式加1

    我正在尝试复制并粘贴一些保持格式的单元格 并将它们链接到表格 目前我有一张桌子 但我从另一张纸上引用它 例如 Sheet2 A1 Sheet2 B1 Sheet2 C1 Sheet2 D1 Sheet2 E1 我试图一次将其复制 4 行并粘
  • 域名正则表达式

    尝试从 URL 中提取域名 例如 x lt https stackoverflow com questions ask to stackoverflow com 我从这个问题中找到了以下正则表达式 正则表达式匹配主域名 regex lt 0
  • 逻辑或条件

    在 grails gsp 中 而不是
  • 在 R 启动时运行 R 脚本

    我只想运行 R 脚本example r当我启动 R 时自动 我在用R version 3 2 3 on centOS 我搜索了这个 但我无法弄清楚 R的启动行为可以通过编辑来修改Rprofile site 可能需要创建它 因为默认的 R 安
  • 安装mysqldb python界面时找不到mysql_config

    我正在尝试让 Python 脚本在我通过 ssh 连接的 Linux 服务器上运行 该脚本使用 mysqldb 我拥有我需要的所有其他组件 但是当我尝试通过 setuptools 安装 mySQLdb 时 如下所示 python setup
  • JQuery,从 DOM 元素获取所有数据属性

    我有一个具有多个数据属性的选择
  • pyspark:groupby 和聚合 avg 和多列上的第一个

    我有一个以下示例 pyspark 数据帧 在 groupby 之后我想计算平均值 以及多列中的第一个 在实际情况下 我有 100 列 所以我无法单独执行此操作 sp spark createDataFrame a 2 4 cc anc a
  • 无法获取 gemfile 以允许捆绑包更新

    我是红宝石 Rails 新手 这是我的宝石文件 source https rubygems org ruby 2 0 0 ruby gemset railstutorial rails 4 0 gem rails 4 0 0 group d
  • Qt 拖放到 Windows 资源管理器:如何知道拖放的目标路径

    我想做的是显示在线文件的列表视图 就像 FTP 客户端列出 FTP 服务器上的所有文件一样 并且可以将任意行或多行拖动到任何本地文件夹以将拖动的文件保存在那里 我计划通过以下步骤来实现这一点 初始化拖动事件 并将所选文件的路径保存在服务器上
  • 508的http响应状态是什么?

    在我的网站上 加载图像 视频时 有时我会在控制台中收到如下错误 Failed to load resource the server responded with a status of 508 Loop Detected 这是什么意思以及
  • 空值被添加到所有 mysql 行,而不仅仅是目标行

    将数据提交到我的服务器后 空列将被添加到我的 MySQL 行中 我将其输入一行 但所有行至少有一个空列 我怎样才能防止这种情况发生 这是一个例子 任何 0 字节都是空行 到目前为止我的 PHP 代码 当我弄清楚这部分时将会更改
  • 迭代 TreeView 节点

    我使用此代码来迭代所有 TreeView 节点 for TreeItem
  • Python 子进程 .check_call 与 .check_output

    我的 python 脚本 python 3 4 3 通过子进程调用 bash 脚本 import subprocess as sp res sp check output bashscript shell True The bash脚本包含