subprocess

# 推荐使用call、check_call和check_output这三个快捷函数,在无法满足需求的时候才使用更高级的Popen接口

# call
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
运行由args参数提供的命令,等待命令执行结束并返回返回码。args参数由字符串形式提供且有多个命令参数时,需要提供shell=True.
subprocess.call('ls -l', shell=True)
多个命令参数通过列表的形式提供时不需要提供shell=True参数
subprocess.call(['ls', '-l'])
## 注意点: 尽量都少用如下PIPE
不要为stdout和stderr参数赋值subprocess.PIPE,如果子进程输出量较多会造成死锁,这两个参数可以赋值为subprocess.STDOUT打印到屏幕或者赋值为一个文件对象将输出写入文件
import subprocess as sp
sp.call('python run.py', shell=True, stdin=open('fake_input', 'r'), stdout=open('result', 'w'))


# 允许你去创建一个新的子进程让其执行另外的程序,并与它进行通信,获取标准的输入,标准输出,标准错误以及返回码等
import subproecss

subprocess.run(['df', '-h'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)


stdin,stdout,stderr:分别表示程序的标准输入、标准输出、标准错误。有效的值可以是PIPE,存在的文件描述符,存在的文件对象或None,如果为None需从父进程继承过来,stdout可以是PIPE,表示对子进程创建一个管道,stderr可以是STDOUT,表示标准错误数据应该从应用程序中捕获并作为标准输出流stdout的文件句柄。

subprocess.check_output() #可以执行一条sh命令,并返回的子程序的执行结果,返回unicode,需要用decode解码,如果子进程退出码不是0,报CalledProcessError异常错误,异常的output字段包含错误输出。

subprocess.check_call() # 命令执行成功返回返回码0,否则抛出subprocess.CalledProcessError异常。异常包括returncode、cmd、output等属性,其中returncode是子进程的退出码,cmd是子进程的执行命令,output为None。

subprocess.call(args ,*, stdin=None , stdout=None, stderr=None, shell=False) # 命令执行成功返回0,否则返回非0

shell:表示使用linux shell,默认shell为False,正常情况下传递的命令是字符串列表,如果使用了shell=True,那么传递的命令为字符串,python会首先运行一个shell,再用这个shell来解释整个字符串

subprocess.Popen   # Popen对象创建后,子进程便会运行,Popen类提供了若干方法来控制子进程的运行
- wait # 等待子进程结束
- poll # 检查子进程状态
- kill # 给子进程发送SIGKILL信号终止子进程
- send_signal   # 向子进程发送信号
- terminate  # 给子进程发送SIGTERM信号终止子进程
- communicate  # 与子进程交互
# 示例
def execute_cmd(cmd):
  p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  stdout, stderr = p.communicate()
  if p.returncode != 0:
    return p.returncode, stderr
  return p.returncode, stdout
posted @ 2021-06-10 09:08  我在路上回头看  阅读(157)  评论(0编辑  收藏  举报