文章目录
简介
subprocess 是一个允许python在主机上运行一个子进程,该子进程可以去与该计算机通过 == “输入” “输出”“错误输出”“管道” ==等与计算机进行交互,并将此子进程获取的命令执行的返回值返回给主进程。总结一句话就是,子进去去执行命令,然后将结果返回给主进程进行进一步的处理。
主要的方法
run()方法
运行带参数的命令,返回一个完整的进程实例。
def run(*popenargs,
input=None, capture_output=False, timeout=None, check=False, **kwargs)
- 返回的实例可能会一些属性参数,返回码,标准输出或者标准错误输出。默认情况下,标准输出与标准错误输出是不抓获的
- 这两个的属性可以是None,stdout=PIPE stderr=PIPE 这样可以去抓取这些信息。
- 如果退出状态码不为0,将会抛出一个异常“ CalledProcessError”,这个对象会返回一个状态码,输出和错误输出会捕获到他。
- 如果“timeout”时间给定了,进程的处理时间超时了后,会抛出一个异常“TimeoutExpired”
- 一个可选参数“input”允许输入“bytes”或者"string"到这个子进程的“标准输入”,如果使用了这个选项,将不能使用Popen的“stdin”的选项。
- 缺省情况下,所有的通信是使用的“bytes”,所以“input”会是bytes,标准输出与标准错误输出也会是"bytes",如果在text模式中,“input”会是字符串型,标准输出与标准错误输出会是string类型,会按照当前的编码设置进行解码。
- 其它的参数与Popen一样
示例一:
import subprocess
subprocess.run("dir",shell=True)
"""
Volume in drive E is New Volume
Volume Serial Number is 0055-ECC4
Directory of E:\Python\Pycharm\Lab\week11
09/25/2020 05:09 PM <DIR> .
09/25/2020 05:09 PM <DIR> ..
09/25/2020 11:28 AM 364 socketclient.py
09/25/2020 03:00 PM 1,554 sockettest.py
09/25/2020 05:09 PM 51 testsubprocesses.py
09/23/2020 05:40 PM <DIR> __pycache__
3 File(s) 1,969 bytes
3 Dir(s) 46,847,115,264 bytes free
"""
Popen接口(subprocess的核心)
class Popen(object):
Popen的介绍
方法名 | 用途 |
---|---|
args | 一个字符串, 或者程序运行需要的参数队列. |
bufsize | 当创建 stdin/stdout/stderr(标准输入/标准输出/标准错误输出) pipe(管道) file 对象时,为 open() 函数 需要使用到的参数的缓存 |
executable | 一个可替代的可执行的程序 |
stdin, stdout and stderr(标准输入/标准输出/标准错误输出) | 这些分别指定可执行程序的’ 标准输入, 标准输出 和 标准错误输出的处理者. |
preexec_fn: | (仅POSIX) 在子进程中被调用的对象,仅在子进程被执行之前 |
close_fds: | 控制关闭或者继承相应的文件描述符. |
shell: | 如果为“true”,命令将会使用shell进行执行. |
cwd: | 在子进程被执行之前,设置当前的工作目录. |
env: | 为新的进程设置相应的环境变量. |
text: | 如果为“true”, 如果给定了,则使用给定的解码方式解码标准输入,标准输出,标准错误输出。如果没有给定,则使用系统默认的解码方式。 |
universal_newlines: | 文本的别名, 提供可加删的能力. |
encoding and errors: | Text mode encoding and error handling to use for file objects stdin, stdout and stderr. |
示例一:创建一个子进程,然后执行一个简单的命令
示例
import subprocess
while True:
cmd = input("input command you want to execute:")
if cmd == "exit":
break
subprocess.Popen("cmd", shell=True)
运行并结果输出
input command you want to execute:dir
input command you want to execute:Microsoft Windows [Version 10.0.18362.836]
(c) 2019 Microsoft Corporation. All rights reserved.
E:\Nextcloud\NAS\Study\Study-Note\Python\Pycharm\Lab\week11>
Popen的子方法
方法名 | 用途 |
---|---|
poll() | 检查进程是否终止,如果终止返回 returncode,否则返回 None。 |
wait(timeout) | 等待子进程终止。 |
communicate(input,timeout) | 和子进程交互,发送和读取数据。 |
send_signal(singnal) | 发送信号到子进程 。 |
terminate() | 停止子进程,也就是发送SIGTERM信号到子进程。 |
kill() | 杀死子进程。发送 SIGKILL 信号到子进程。 |
subprocess.PIPE
默认情况下,输出结果会直接展示到屏幕上来(标准输出),但是这个结果是通过一个子进程的方式进行运行的,所以我们需要将这个子进程运行的消息提到主进程进进行展示,所以将期封装进入到对象中,通过特定的方法进行调用。通过stdout进行调用方法。
import subprocess
result = subprocess.run("dir",shell=True,stdout=subprocess.PIPE)
print(result)
"""
CompletedProcess(args='dir', returncode=0, stdout=b' Volume in drive E is New Volume\r\n Volume Serial Number is 0055-ECC4\r\n\r\n Directory of E:\\Nextcloud\\NAS\\Study\\Study-Note\\Python\\Pycharm\\Lab\\week11\r\n\r\n09/25/2020 05:13 PM <DIR> .\r\n09/25/2020 05:13 PM <DIR> ..\r\n09/25/2020 11:28 AM 364 socketclient.py\r\n09/25/2020 03:00 PM 1,554 sockettest.py\r\n09/25/2020 05:13 PM 106 testsubprocesses.py\r\n09/23/2020 05:40 PM <DIR> __pycache__\r\n 3 File(s) 2,024 bytes\r\n 3 Dir(s) 46,847,115,264 bytes free\r\n')
"""
但是输出为一个bytes类型的,所以需要转换成str
import subprocess
result = subprocess.run("dir",shell=True,stdout=subprocess.PIPE)
print(str(result.stdout,"utf8"))
"""
Volume in drive E is New Volume
Volume Serial Number is 0055-ECC4
Directory of E:\Nextcloud\NAS\Study\Study-Note\Python\Pycharm\Lab\week11
09/25/2020 05:19 PM <DIR> .
09/25/2020 05:19 PM <DIR> ..
09/25/2020 11:28 AM 364 socketclient.py
09/25/2020 03:00 PM 1,554 sockettest.py
09/25/2020 05:19 PM 782 testsubprocesses.py
09/23/2020 05:40 PM <DIR> __pycache__
3 File(s) 2,700 bytes
3 Dir(s) 46,847,111,168 bytes free
Process finished with exit code 0
"""