python3_subprocess

发布时间 2023-10-30 15:01:07作者: 小鱼小鱼hi

python3 subprocess_subprocess python3-CSDN博客

  • subprocess模块允许你启动一个新的进程,连接输入/输出/错误的管道,
    获得子进程的返回码。这个模块目标是代替一些老的模块,比如os.system和os.spawn.
  • subprocess.run

 

subprocess.run(args, *, stdin=None, input=None, stdout=None, 
stderr=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None)

args参数表示需要执行的命令,主进程会等待子进程执行完成,并返回一个CompletedProcess实例。

这个方法默认不捕获标准输出和标准错误。如果需要捕获的话,需要传递PIPE给stdout和stderr参数。

timeout参数传递给Popen.comunicate()方法。如果超时了,子进程会被杀死并且等待。TimeoutExpired会在子进程终止后被抛出。

input参数也传递给Popen.communicate()方法

import subprocess
def runcmd(command):
    ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8",timeout=1)
    if ret.returncode == 0:
        print("success:",ret)
    else:
        print("error:",ret)


runcmd(["dir","/b"])#序列参数
runcmd("exit 1")#字符串参数

shell=True:表示执行的是shell命令。
subprocess.PIPE:可以用给stdout,stdin,stderr.表示为标准流打开一个管道,常用来捕获子进程的输出和错误.
encoding:指出了标准流的编码格式,不指定的话默认是二进制的.
timeout:指出子进程的超时时间。如果超时会抛出一个TimeoutExpired异常。

 

  • subprocess.Popen
    Popen是subprocess的核心,子进程的创建和管理都靠它处理
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, 
preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, 
startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False, pass_fds=(),
*, encoding=None, errors=None)

args:表示要执行的命令,应当是一个参数的序列,或者就是一个字符串。一般推荐使用序列进行传递。但是如果shell指定为True的话,推荐使用字符串。

bufsize:缓冲区大小。当创建标准流的管道对象时使用。默认-1
0:不使用缓冲区
1:表示行缓冲,仅当universal_newlines=True时可用,也就是文本模式
正数:表示缓冲区大小
负数:表示使用系统默认的缓冲区大小。

executable:指定一个替代的程序去执行。这个参数几乎不会被用到。当shell=False的时候此参数替代args执行,然而,原始的args依旧传递给程序。很多程序把args当做命令的名字,而不是真正执行的程序。如果shell=True,在POSIX上此参数指定一个替代的shell来替换默认的/bin/sh。

stdin,stdout和stderr:分别表示标准输入,输出,和错误流。可用的参数是PIPE,DEVNULL,文件描述符,文件对象或者None。

preexec_fn:设置一个可访问的对象,在子进程执行之前会调用这个对象。

close_fds:如果是Ture,那么文件描述符除了0,1和2外,在子进程执行之前都会被关闭。在POSIX上总是为True.在windows上,标准流为None是为Ture,不能通知指定True和标准流。

cwd:在子进程执行之前改变工作目录,
restore_signals:存储进程信号,默认为True
start_new_session:如果是True,则在子进程执行之前条用系统setsid方法。
encoding,errors:如果指定了,那么标准流会以文本模式打开。

 

Popen对象方法

poll():检查进程是否终止,如果终止返回returncode,否则返回None。
wait(timeout):等待子进程终止。
communicate(input,timeout):和子进程交互,发送和读取数据。
send_signal(singnal):发送信号到子进程
terminate():停止子进程,也就是发送SIGTERM信号到子进程。
kill():杀死子进程。发送SIGKILL信号到子进程