一文读懂Python中的Popen函数

吴旭华  金牌会员 | 2024-9-28 08:19:29 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 832|帖子 832|积分 2496

1. 基本知识

在Python中,Popen 是 subprocess 模块中的一个函数,它用于创建一个子历程并与其举行通讯


  • subprocess.Popen():Popen 类用于创建和管理子历程
    与 os.system() 或 os.popen() 相比,Popen 提供了更多的灵活性,如读取子历程的标准输出和标准错误
    参数分析:
    exe_path: 要执行的可执行文件或命令
    stderr=PIPE:将子历程的标准错误重定向到管道,以便父历程可以捕捉
    stdout=PIPE:(可选)可以重定向标准输出
  • exe.communicate():
    communicate() 用于与子历程举行交互。它会等待子历程完成执行,并返回一个包罗标准输出和标准错误的元组
    调用 communicate() 后,子历程的输入输出流会被关闭
  • stderr 和 stdout:
    stderr:记载子历程的标准错误输出,通常包罗执行过程中碰到的错误信息
    stdout: 包罗子历程的标准输出,即执行命令后的结果
具体调用方式:
  1. import subprocess
  2. # 示例: 使用 Popen 打开一个子进程执行 exe
  3. exe_path = "path_to_executable.exe"  # 替换为实际的可执行文件路径
  4. exe = subprocess.Popen(exe_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  5. # 与子进程交互并等待其完成
  6. stdout, stderr = exe.communicate()
  7. # 打印标准输出和错误输出
  8. print("Standard Output:", stdout.decode('utf-8'))
  9. print("Standard Error:", stderr.decode('utf-8'))
复制代码

  • 启动子历程:使用 Popen 启动指定的可执行文件 exe_path
    此过程在后台运行,父历程不会被阻塞
  • 捕捉输出:通过 stderr=PIPE 参数,可以捕捉子历程的错误信息
    可以同时捕捉 stdout=PIPE 来获取执行的结果
  • 处理子历程的结果: 调用 communicate(),该方法会阻塞,直到子历程完成运行
    返回的 stdout 和 stderr 是字节流,因此需要通过 decode(‘utf-8’) 将其转换为字符串
2. Demo

假设有一个简单的可执行文件 example.exe,可以如下调用:
  1. import subprocess
  2. # 可执行文件路径
  3. exe_path = "example.exe"
  4. # 启动子进程,捕获标准输出和标准错误
  5. exe = subprocess.Popen([exe_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  6. # 与子进程交互
  7. stdout, stderr = exe.communicate()
  8. # 打印输出和错误
  9. if stdout:
  10.     print("Standard Output:", stdout.decode('utf-8'))
  11. if stderr:
  12.     print("Standard Error:", stderr.decode('utf-8'))
复制代码
常见题目


  • 子历程卡住:假如子历程产生了大量输出且没有实时处理,管道可能会被填满,导致子历程挂起
    这种情况下,可以考虑手动读取流
  • 捕捉实时输出:假如需要实时读取子历程的输出而不是等到 communicate() 返回,可以循环读取 stdout

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表