ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Python小记 多进程 subprocess

2021-11-06 14:04:09  阅读:175  来源: 互联网

标签:None Python Popen subprocess PIPE stderr 进程 小记


subprocess

文章目录


常用内置方法

1.subprocess.call()

subprocess.call(
	args,*,
	stdin=None,
	stdout=None,
	stderr=None,
	shell=False
	)
  • 执行args指定的命令,直到命令结束,返回返回码的属性值
  • shell=True(安全保护机制)。此时不要使用stdout=PIPEstderr=PIPI,不然会导致进程输出的死锁
  • 如要用管道,可在communicate()方法中使用Popen

2.subprocess.check_call()

subprocess.check_call(
	args,*,
	stdin=None,
	stdout=None,
	stderr=None,
	shell=False)
  • 执行args指定的命令,直到命令结束
  • 返回码为0则返回,否则抛出CalledProcessError异常
  • shell=True(安全保护机制)。
    此时不要使用stdout=PIPEstderr=PIPI,不然会导致进程输出的死锁
  • 如要用管道,可在communicate()方法中使用Popen

3.subprocess.check_output()

subprocess.check_output(
	args,*,
	stdin=None,
	stderr=None,
	shell=False,
	univeral_newlines=False)
  • 执行args指定的命令
  • 返回一字符串表示输出值
  • 返回码为0则返回,否则抛出CalledProcessError异常
  • shell=True(安全保护机制)。此时不要使用stdout=PIPEstderr=PIPI,不然会导致进程输出的死锁
  • 如要用管道,可在communicate()方法中使用Popen

参数说明:

  • args
  • 字符串 或 程序参数序列(推荐)
  • stdin, stdout, stderr
  • 标准输入、输出、错误的文件句柄
  • 可以是 PIPENone (默认)
  • shell
  • True 则通过命令行来执行
improt subprocess
subprocess.call(['python', 'test.py'])
  上面的几个函数都是基于Popen()的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。
  当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程.

Popen 创建进程

Popen对象创建后,主程序不会自动等待子进程完成。
我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)
subprocess.Popen(args,
	bufsize=-1,
	excutable=None,
	stdin=None,stdou=None,stderr=None,
	preexec_fn=None,
	close_fds=True,
	shell=False,
	cwd=None,env=None,
	universal_newlines=False,
	startupinfo=None,
	creationflags=0
	)
  • args
    • 字符串或序列类型(列表、元组)
    • 指定进程的可执行文件及其参数
  • excutable
    • 指定可执行程序
    • shell=True:用于指定程序使用的 shell
  • bufsize
    • 指定缓冲区大小
  • stdin, stdout, stderr
    • 表示程序标准输入、输出、错误句柄。
    • 可为PIPE、文件描述符、文件对象、None
  • preexec_fn
    • 仅在UNIX平台有效。
    • 指定一 可调用对象,它将在子进程之前调用
  • close_fds
    • Windows:True,新建子进程将不会继承父进程的输入、输出、错误管道
    • 不能同时True 和 同时定向子进程的stdin、stdout、stderr
  • shell
    • True:通过shell执行
  • cwd
    • 设置子进程的当前目录
  • env
    • 字典类型
    • 用于指定子进程环境变量
    • None:子进程环境变量将从父进程继承
  • universal_newlines
    • True:将换行符当做\n处理
  • startupinfocreationfalgs
  • 只在Windows有效。
  • 用于设置子进程一些属性

Popen 常见内置对象

  • subprocess.PIPE
    • 创建Popen对象时,PIPE可以初始化stdin、stdout、stderr
    • 表示与子进程通信的标准流
  • subprocess.SRDOUT
    • 创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出

Popen 常见内置方法

  • poll()
    检查子进程是否结束。设置并返回returncode属性
  • wait()
    等待子进程结束。设置并返回returncode属性
  • communicate(input=None)
    • 与子进程交互。向stdin发送数据、从stdout/stderr读取数据
    • input:发送到子进程的参数
    • 需要子进程stdin向其发送数据,创建Popenstdin设置为PIPE
    • 需要从stdoutstderr获取数据,创建时…设置为PIPE
  • send_signal(signal)
    向子进程发送信号
  • terminate()
    停止(stop)子进程。
  • kill()
    终止子进程

  • Popen.stdin
    • 创建时stdin如为PIPE,返回一文件对象,用于向子进程发送指令
    • 否则,返回None
  • Popen.stdout
    • 创建时stdout如为PIPE,返回一文件对象,用于向子进程发送指令
    • 否则,返回None
  • Popen.stderr
    • 创建时stderr如为PIPE,返回一文件对象,用于向子进程发送指令
    • 否则,返回None
  • Popen.pid
    获取子进程的进程ID
  • Popen.returncode
    获取进程返回值
    如果进程还没结束,返回None

import subprocess

prcs = subprocess.Popen(['Python', 'test.py'],
	stdout=subprocess.PIPE,
	stdin=subprocess.PIPE,
	stderr=subprocess.PIPE,
	universal_newlines=True,
	shell=True)
prcs.communicate("这些文字都来自: stdin.")	
print('subprocess pid: ', prcs.pid)
print('\nSTDOUT:')
print(str(prcs.communicate()[0]))
print('\nSTDERR:')
print(prcs.communicate()[1])

标签:None,Python,Popen,subprocess,PIPE,stderr,进程,小记
来源: https://blog.csdn.net/qq_45020818/article/details/121177138

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有