首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么子进程在communicate()完成后仍在运行?

子进程在调用communicate()方法后仍然在运行的原因是communicate()方法只是用来与子进程进行交互的,它会等待子进程执行完毕并返回输出结果。但是它并不会等待子进程完全终止。

在调用communicate()方法后,父进程会阻塞等待子进程的输出结果,同时子进程会继续执行直到完成。这意味着子进程可能会在communicate()方法返回之后继续运行一段时间。

如果希望在调用communicate()方法后确保子进程完全终止,可以使用wait()方法来等待子进程的终止。wait()方法会阻塞父进程直到子进程终止。

需要注意的是,communicate()方法和wait()方法都是阻塞的,即会暂停父进程的执行直到满足条件。因此,在使用这些方法时需要根据具体情况来决定是否需要阻塞父进程。

总结起来,子进程在communicate()完成后仍在运行是因为communicate()方法只是等待子进程执行完毕并返回输出结果,而不会等待子进程完全终止。如果需要确保子进程完全终止,可以使用wait()方法来等待子进程的终止。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python subprocess与命令行交互

Python subprocess 模块是一个功能强大的库,用于启动和与流程交互。 它附带了一些高级 api,比如调用、检查输出和运行,这些都集中的程序运行和等待完成的进程上。...将它作为一个进程启动,然后将客户机连接到它,并运行一些测试序列。 当完成后,希望以一种有序的方式关闭子程序。 这对于同步运行进程的 api 来说是很难实现的,因此必须查看一些底层级别的 api。...使用底层的 Popen API 异步启动进程(意味着 Popen 立即返回,进程在后台运行)。...terminate()向进程发送一个 SIGTERM 信号。 然后,proc.communicate等待进程退出并捕获所有的标准输出。...线程会轮询标准输出属性,只要有新行可用,就会循环并立即打印它们。 如果运行这个示例,您将注意到进程的 stdout 是实时报告的,而不是最后报告一个错误。

7.6K22

Python标准库06 进程 (subprocess包)

subprocess以及常用的封装函数 当我们运行python的时候,我们都是创建并运行一个进程。...Python中,我们通过标准库中的subprocess包来fork一个进程,并运行一个外部的程序(fork,exec见Linux进程基础)。...使用subprocess包中的函数创建进程的时候,要注意: 1) 创建进程之后,父进程是否暂停,并等待进程运行。 2) 函数返回什么 3) 当returncode不为0时,父进程如何处理。...www.google.com"]) print("parent process") 从运行结果中看到,父进程开启子进程之后并没有等待child的完成,而是直接运行print。...要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到进程完成。

2.8K60
  • python中的subprocess

    UNIX上,shell = False(默认):在这种情况下,Popen类使用os.execvp()来执行程序的进程。args应该通常是一个序列。字符串将被视为只有一个字符串的序列(程序执行)。...等待命令完成后返回返回码属性。     这些参数相对于Popen构造函数是相同的。    ...communicate(input=None)     与进程相互作用: 发送数据到标准输入。从标准输出、标准错误读取数据, 直到到达文件尾。等待进程终止。...可选的input参数应该是发送给进程的字符串,或者如果没有要发送给进程的数据那就用None      communicate() 返回一个元组 (stdout, stderr).     ...,否则为None pid     进程的PID returncode     进程的返回码。

    1.6K30

    python笔记65 - Python3 subprocess执行命令行获取返回结果

    前言 subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。 Popen 是 subprocess的核心,进程的创建和管理都靠它处理。...stdin, stdout, stderr: 分别表示程序的标准输入、输出、错误句柄 preexec_fn: 只 Unix 平台下有效,用于指定一个可执行对象(callable object),它将在进程运行之前被调用...cwd: 用于设置进程的当前目录。 env: 用于指定子进程的环境变量。 如果 env = None,进程的环境变量将从父进程中继承。...wait(timeout): 等待进程终止。 communicate(input,timeout): 和进程交互,发送和读取数据。...send_signal(singnal): 发送信号到进程 。 terminate(): 停止进程,也就是发送SIGTERM信号到进程。 kill(): 杀死进程

    9K20

    Python 执行系统命令

    system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个进程系统上执行命令行,进程的执行结果无法影响主进程。...一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。...3、Popen.communicate(input=None):与进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到进程的参数。...windows平台下,该方法将调用Windows API TerminateProcess()来结束进程。 6、Popen.kill():杀死进程。...12、subprocess.call(*popenargs, **kwargs):运行命令。该函数将一直等待到进程运行结束,并返回进程的returncode。文章一开始的例子就演示了call函数。

    1.7K10

    K8s Pod优雅关闭,没你想象的那么简单!

    当 Kubernetes 杀死一个 pod 时,会发生以下 5 个步骤: 1、 Pod 切换到终止状态并停止接收任何新流量,容器仍在 pod 内运行。...如果容器宽限期后仍在运行,则 Pod 被 SIGKILL 强行移除,终止完成。...理想情况下,一个容器只有一个进程,但是现实场景下很难做到,比如,我会用一个 shell 脚本去管理和启动 Java 进程,除了 shell 脚本主进程之外,还要运行监控、日志收集等子进程,这样一个容器里面就运行了多个进程...系统底层默认会向主进程发送 SIGTERM 信号,而对剩余进程发送 SIGKILL 信号。...也就是说如果主进程自身不是服务本身,可能会导致是被强制Kill的,解决的方法也很简单,也就是进程中对收到的信号做个转发,发送到容器中的其他进程,这样容器中的所有进程停止时,都会收到 SIGTERM

    2.4K20

    python—subprocess、gl

    一、subprocess模块 1.subprocess以及常用的封装函数 运行python的时候,我们都是创建并运行一个进程。...像Linux进程那样,一个进程可以fork一个进程,并让这个子进程exec另外一个程序。Python中,我们通过标准库中的subprocess包来fork一个进程,并运行一个外部的程序。...child的完成,而是直接运行print 例2(父进程等待进程): #!...child.stdout child.stderr 可以Popen()建立进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道...child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本;communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到进程完成

    1.5K20

    Python调用系统命令的六种方法

    os.system() system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个进程系统上执行命令行,进程的执行结果无法影响主进程。...其返回值是指令运行后返回的状态码,0表示指令成功执行,1表示失败,256表示没有返回结果,该方法适用于系统命令不需要输出内容的场景。...官方推荐使用该模块执行系统命令,subprocess模块通过进程来执行外部指令,并通过input/output/error管道,获取进程的执行的返回信息。...()) # 标准输出的字符串+标准错误的字符串 outinfo, errinfo = proc.communicate() print(outinfo.decode('gbk')) # 外部程序(windows...tmpfs 184M 0 184M 0% /run/user/0 subprocess.run() python3.5中新增的函数, 执行指定的命令, 等待命令执行完成后返回一个包含执行结果的

    3.9K20

    python的subprocess模块

    通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了 ​ stdout: 从子进程捕获的stdout。...等待进程结束。...ID Popen.returncode 获取进程状态码,0表示进程结束,None未结束 使用Popen调用系统命令式,建议使用communicate与stdin进行交互并获取输出(stdout),...平台下有效,用于指定一个可执行对象,它将在进程运行之前被调用 close_sfs:Windows平台下,如果close_sfs被设置为True,则新创建的进程将不会继承父进程的输入、输出、错误管道...如果env=None,进程的环境变量将从父进程中继承 universal_newlines:不同系统的换行符不同,True->同意使用\n startupinfo与createionflags只Windows

    3K20

    subprocess:Python中创建进程

    前言 subprocess库提供了一个API创建进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。...系统常用的whoami命令,返回当前用户的名称,输出如下: 这里,我们使用了subprocess.run调用了进程运行windows命令。...returncode为进程的退出状态码。通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了。...通过Shell返回消息 本例会通过一个shell运行命令,命令返回错误码并退出之前,将详细输入到控制台。...与进程的单项通信 要运行一个进程并读取它的所有输出,可以设置stdout为PIPE并调用communicate()函数。

    52570

    python模块之subprocess模块级方法

    subprocess.run() 运行并等待args参数指定的指令完成,返回CompletedProcess实例。...input:input参数将作为进程的标准输入传递给Popen.communicate()方法,必须是string(需要指定encoding或errors参数,或者设置text为True)或byte类型...timeout:传递给Popen.communicate()方法。 check:如果设置为True,进程执行返回非0状态码将抛出CalledProcessError异常。...调用call()函数不要使用stdout=PIPE或stderr=PIPE,因为如果子进程生成了足量的输出到管道填满OS管道缓冲区,进程将因不能从管道读取数据而导致阻塞。...subprocess.getstatusoutput(cmd) 实际上是调用check_output()函数,shell中执行string类型的cmd指令,返回(exitcode, output)形式的元组

    2.3K20

    python调用shell命令小结

    subprocess类总主要的方法有: subprocess.call:开启子进程,开启子进程运行命令,默认结果是返回值,不能try  subprocess.check_call:运行命令,默认结果是返回值...,可以try  subprocess.check_out(2.7中才有这个方法) 开启子进程运行命令,可以获取命令结果,可以try  subprocess.Popen 开启子进程运行命令,没有返回值...,不能try,可以获取命令结果 subprocess.PIPE 初始化stdin,stdout,stderr,表示与进程通信的标准流 Popen.poll 检查进程是否结束,并返回returncode...Popen.wait等待进程是否结束,并返回retrurncode 比如check_call的sample: import subprocess import traceback cmd='hadoop...    retcode = process.poll()   #检查进程是否结束,并返回returncode     if retcode:         cmd = kwargs.get("args

    1.3K20
    领券