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

Python - [Subprocess Popen Communicate]在执行时挂起

基础概念

subprocess.Popen 是 Python 标准库 subprocess 模块中的一个类,用于创建和管理子进程。communicate() 方法是 Popen 类的一个方法,用于与子进程进行交互,通常用于读取子进程的输出和向子进程发送输入。

相关优势

  • 隔离性:子进程与主进程相互独立,一个进程的崩溃不会影响另一个进程。
  • 灵活性:可以方便地启动外部命令,并与其进行交互。
  • 安全性:可以通过设置环境变量、工作目录等来控制子进程的行为。

类型

  • 同步通信:使用 communicate() 方法,主进程会等待子进程完成。
  • 异步通信:可以使用 poll()wait() 方法来检查子进程的状态,而不必等待其完成。

应用场景

  • 执行外部命令:如运行 shell 脚本、调用系统工具等。
  • 进程间通信:在主进程和子进程之间传递数据。

问题及原因

当使用 Popen.communicate() 方法时,如果子进程的输出量很大或者输出速度很慢,可能会导致主进程挂起。这是因为 communicate() 方法默认会一次性读取所有输出,如果输出量过大,会导致内存不足或阻塞。

解决方法

  1. 设置超时
代码语言:txt
复制
import subprocess

proc = subprocess.Popen(['your_command'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
try:
    stdout, stderr = proc.communicate(timeout=10)  # 设置超时时间为10秒
except subprocess.TimeoutExpired:
    proc.kill()
    stdout, stderr = proc.communicate()
  1. 逐行读取输出
代码语言:txt
复制
import subprocess

proc = subprocess.Popen(['your_command'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
while True:
    line = proc.stdout.readline()
    if not line:
        break
    print(line.strip())
  1. 使用 poll() 方法
代码语言:txt
复制
import subprocess

proc = subprocess.Popen(['your_command'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while proc.poll() is None:
    output = proc.stdout.readline()
    if output == '' and proc.poll() is not None:
        break
    if output:
        print(output.strip())

参考链接

通过以上方法,可以有效避免 Popen.communicate() 方法在执行时挂起的问题。

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

相关·内容

Python Subprocess库详解

简介 Subprocess库是Python中用于创建和管理子进程的标准库。它提供了一个强大而灵活的接口,使得你可以Python中启动新的进程、连接它们的输入和输出,并与它们进行交互。...超时处理 实际应用中,我们可能希望设置子进程的最长运行时间,以避免因子进程无法正常退出而导致父进程一直等待。...使用capture_output参数简化输出捕获 Python 3.7及以上版本中,subprocess.run()引入了capture_output参数,用于简化输出的捕获。...使用subprocess.Popen的timeout参数设置超时时间 subprocess.Popen的timeout参数允许你设置子进程的最长运行时间,以避免因子进程无法正常退出而导致父进程一直等待。...使用subprocess.Popen的timeout参数设置超时时间 subprocess.Popen的timeout参数允许你设置子进程的最长运行时间,以避免因子进程无法正常退出而导致父进程一直等待。

2.3K21

Python模块之subprocess

一 简介 使用Python 开发MySQL自动化相关的运维工具的时候,遇到一些有意思的问题,本文介绍Pythonsubprocess 模块以及如何和MySQL交互具体操作,如启动 ,关闭 ,备份数据库...1 >>> 通过上面三个例子,我们可以看出前面两个函数不容易控制输出内容,使用subprocess包中的函数创建子进程执行命令的时候,需要考虑 1) 创建子进程之后,父进程是否暂停,并等待子进程运行...注意:如果希望通过进程的stdin向其发送数据,创建Popen对象的时候,参数stdin必须被设置为PIPE。...那么坑爹的问题来了:当你要使用Pythonsubprocess.Popen实现命令行之间的管道传输,同时数据源又非常大(比如读取上GB的文本或者无尽的网络流)时,官方文档不建议用wait,同时communicate...五 参考资料 [1] 官方文档 [2] Python中的subprocess与Pipe [3] python类库31[进程subprocess]

2K10
  • 【module】subprocess

    subprocess subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn、os.popen、commands....python3中结果为byte类型,要得到str类型需要decode转换一下 输出结果(读) # 直接执行命令输出到屏幕 >>> subprocess.Popen("ls -l",shell=True...shtin来实现 # 以下实现打开python3的终端,执行一个print命令 proc = subprocess.Popen(['python3'],stdin=subprocess.PIPE,stdout...捕获错误输出 proc = subprocess.Popen(['python3'],stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE...其他方法 Popen.pid 查看子进程ID Popen.returncode 获取子进程状态码,0表示子进程结束,None未结束 使用Popen调用系统命令式,建议使用communicate与stdin

    1.9K40

    pythonsubprocess模块

    说明: Python 3.5之后的版本中,官方文档中提倡通过subprocess.run()函数替代其他函数来使用 ​ ​subproccess模块的功能; ​ Python 3.5之前的版本中,我们可以通过...subprocess.Popen(): 一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。...python3中结果为byte类型,要得到str类型需要decode转换一下 直接执行命令输出到屏幕 ​ subprocess.Popen("ls -l",shell=True) ​ <subprocess.Popen...', None) 需要进行相互交互的输入输出过程也可以使用shtin来实现 以下实现打开python3的终端,执行一个print命令 ​ proc = subprocess.Popen(['python3...其它方法 Popen.pid 查看子进程ID Popen.returncode 获取子进程状态码,0表示子进程结束,None未结束 使用Popen调用系统命令式,建议使用communicate与stdin

    3K20

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

    作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system()、os.popen()、subprocess.popen()、subprocess.call...os.system() system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程系统上执行命令行,子进程的执行结果无法影响主进程。...模块 subprocess模块是python从2.4版本开始引入的模块,主要用来取代 一些旧的模块方法,如os.system、os.spawn、os.popen、commands....subprocess.Popen() 使用Popen可以创建进程,并与进程进行复杂的交互。 用法:child = subprocess.Popen(["cmd","arg1"...])...模块的具体用法,大家可以查看文档进行学习https://docs.python.org/3/library/subprocess.html。

    3.9K20

    Python调用linux系统命令--使

    python 中调用系统命令,如果使用subprocess.Popen() 模块,按照命令参数的的形式,可以分两种: 把命令当作字符串传给subprocess.Popen()  把命令保存到一个元组,...list 的序列,再传给subprocess.Popen()  subprocess模块使用Popen类创建子进程执行命令,首先subprocess.Popen() 的原型: subprocess.Popen...如: p = subprocess.Popen() 创建了子进程p 执行命令,外部需要给命令传入参数,则可以用p.communicate(stdin_some)方法,将stdin_some 传入p.stdin...同时p.commucincate() 返回一个tuple 值 (stdout_some,  stderr_some) = p.communicate(stdin_some).所以,调用subprocess.Popen...subprocess.Popen 的一些方法: Popen.communicate() :  与外部通信,(out, errout) = Popen.communicate(), 返回标准输出和错误输出

    5.1K20

    Python 执行系统命令

    系统命令 作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有以下方式 os.system() os.popen() subprocess 模块 os.system...system函数可以将字符串转化成命令服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程系统上执行命令行,子进程的执行结果无法影响主进程。...subprocess模块是python从2.4版本开始引入的模块,主要用来取代 一些旧的模块方法,如os.system、os.spawn、os.popen、commands....注意:如果希望通过进程的stdin向其发送数据,创建Popen对象的时候,参数stdin必须被设置为PIPE。...异常对象中,包括进程的returncode信息 示例 from subprocess import PIPE, Popen # 返回的是 Popen 实例对象 proc = Popen( '

    1.7K10

    python实现局域网ip地址扫描

    python 遍历局域网ip 从知道python开始,我的视线里就没缺少过他。尤其是现如今开发语言大有傻瓜化的趋势。而作为这一趋势的领导,脚本语言就显得格外亮眼。...subprocess.PIPE   创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。...Popen.communicate(input=None)   与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。...注意:如果希望通过进程的stdin向其发送数据,创建Popen对象的时候,参数stdin必须被设置为PIPE。...windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。 Popen.kill()   杀死子进程。

    3K10
    领券