subprocess |
文章目录
常用内置方法
1.subprocess.call()
subprocess.call(
args,*,
stdin=None,
stdout=None,
stderr=None,
shell=False
)
-
执行
args
指定的命令,直到命令结束,返回返回码的属性值 -
shell=True
(安全保护机制)。此时不要使用stdout=PIPE
,stderr=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=PIPE
,stderr=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=PIPE
,stderr=PIPI
,不然会导致进程输出的死锁 -
如要用管道,可在
communicate()
方法中使用Popen
参数说明:
-
args
- 字符串 或 程序参数序列(推荐)
-
stdin
,stdout
,stderr
- 标准输入、输出、错误的文件句柄
- 可以是
PIPE
或None
(默认) -
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
处理
- True:将换行符当做
-
startupinfo
和creationfalgs
- 只在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
向其发送数据,创建Popen
时stdin
设置为PIPE
- 需要从
stdout
、stderr
获取数据,创建时…设置为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])