当前位置: 首页 > 面试题库 >

Python子流程.check_call与.check_output

魏俊茂
2023-03-14
问题内容

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

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

bashscript 包含以下行:

ssh -MNf somehost

这将打开与某个远程主机的共享主连接,以允许进行一些后续操作。

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

使用check_call代替时check_output,我没有此阻塞问题,但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()调用Popen().communicate(),以获取输出。内部.communicate()调用,.wait()check_output()也等待外壳退出并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()可以不等待而退出。

注意:&最后将孙子python进程置于后台。在默认情况下shell=True启动cmd.exe的Windows上,它将无法使用。



 类似资料:
  • 问题内容: 我有以下脚本: 我从打来电话: 而且效果很好。 但是,当我这样做时: 口译员挂了。我究竟做错了什么?我希望能够多次读写另一个进程,以将一些任务传递给该进程。我需要做些什么? 编辑1 如果使用,则会得到以下信息: 编辑2 我试过冲洗: 和这里: 但它再次挂起。 问题答案: 我相信这里有两个问题在起作用: 1)您的父脚本调用,它将读取所有数据,直到文件结束。但是,您的子脚本会无限循环运行,

  • 我对xargs的性能可伸缩性有一个问题。目前,我有一个用python编写的批处理程序,带有多处理和子进程。每个进程产生一个独立的子进程。popen()执行外部命令。最近我意识到整个过程可以用xargs重做。然而,我想知道使用xargs处理10k文件是否是一个好主意,因为我以前从未用命令行工具做过如此大规模的事情。考虑到我对小数据集的测试,如果我所做的只是批量运行一组命令,这其实不是一个坏主意,因为

  • 问题内容: 我正在Python 2.6的GUI前端上工作,通常它非常简单:您使用或发出命令,然后等待命令完成或对错误做出反应。如果您有一个程序停止并等待用户交互,该怎么办?例如,程序可能会停止并要求用户提供ID和密码或如何处理错误? 到目前为止,我所阅读的所有内容都告诉您如何仅 在 程序完成 后 读取程序的所有输出,而不是如何在程序仍在运行时处理输出。我无法安装新模块(这是针对LiveCD的),并

  • 我正在试图理解如何为多个子进程构建并行计算管道。正如我所看到的,每个子进程块等待前一个代码块运行,而我有一个管道,它对前一个运行没有依赖关系,并且可以并行处理。我想知道这是不是可能的,如果是这样的话,一个示例语法来展示如何做到这一点将是一个很大的帮助!提前道谢。

  • 问题内容: 我正在使用python脚本作为水动力代码的驱动程序。是时候运行模拟了,我用来运行代码,将和的输出收集到中,然后我可以打印(并保存到日志文件中)输出信息,并检查是否有错误。问题是,我不知道代码是如何进行的。如果我直接从命令行运行它,它将为我提供有关其迭代次数,时间,下一时间步长等的输出。 有没有办法既存储输出(用于日志记录和错误检查),又产生实时流输出? 我的代码的相关部分: 最初,我是

  • 简明的 我是raspberry pi的初学者,目前正在从事一个项目,该项目需要在启动时运行python脚本。 脚本的一部分将检查某些条件,然后在必要时打开chroum-浏览器(使用子进程。Popen())。 代码 下面是我的python脚本的简短摘录(睡眠是为了检查脚本是否正在运行): 当我从终端运行时,代码似乎正确执行: 但是,当我尝试在crontab上安排它时(使用终端使用“sudo cron