一、常见subprocess方法

1、subprocess.getstatusoutput(cmd)

官方解释:

Return (exitcode, output) of executing cmd in a shell.

Execute the string 'cmd' in a shell with 'check_output' and
return a 2-tuple (status, output). The locale encoding is used
to decode the output and process newlines.

cmd可以直接执行shell命令,而不需要cmd命令以列表输入----subprocess.getstatusoutput("cat /proc/meminfo")

返回值包含cmd的执行状态和执行结果,可以直接赋值给某个变量

实例:

  1. >>> ret = subprocess.getoutput('ls -l')
  2. >>> print(ret)
  3. 总用量 160
  4. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  5. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  6. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  7. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  8. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  9. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  10. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  11. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面
  12. >>> retcode, output = subprocess.getstatusoutput('ls -l')
  13. >>> print(retcode)
  14. 0
  15. >>> print(output)
  16. 总用量 160
  17. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  18. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  19. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  20. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  21. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  22. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  23. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  24. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面
  25. >>> retcode, output = subprocess.getstatusoutput('ls -l /test')
  26. >>> print(retcode)
  27. 2
  28. >>> print(output)
  29. ls: 无法访问/test: 没有那个文件或目录

2、subprocess.getoutput(cmd)

官方解释:

  1. Return output (stdout or stderr) of executing cmd in a shell.
  2.  
  3. Like getstatusoutput(), except the exit status is ignored and the return
    value is a string containing the command's output
  4.  
  5. cmd可以直接执行shell命令,而不需要cmd命令以列表输入---subprocess.getoutput("cat /proc/meminfo")
    返回值包含cmd的执行结果,可以直接赋值给某个变量
    功能和getstatusoutput类似

3、subprocess.run(*popenargs, input=None, timeout=None, check=False, **kwargs))

  1. Run command with arguments and return a CompletedProcess instance. 执行传入命令参数后,返回CompletedProcess实例
  1. The returned instance will have attributes args, returncode, stdout and
    stderr. By default, stdout and stderr are not captured, and those attributes
    will be None. Pass stdout=PIPE and/or stderr=PIPE in order to capture them.
  2.  
  3. check等于True的时候,当执行状态不是0时,会抛出CalledProcessError异常提示
  4.  
  5. 传入命令参数时,需要以多个命令拆分按照列表形式传入:subprocess.run(['df', '-h'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
  6.  
  7. 如果传入参数同时传入shell=True,则传入一个字符串args,shell命令而不是待执行的shell命令序列
  8.  
  9. 实例:
  1. >>> subprocess.run(["ls", "-l"]) # doesn't capture output
  2. CompletedProcess(args=['ls', '-l'], returncode=0)
  3.  
  4. >>> subprocess.run("exit 1", shell=True, check=True)
  5. Traceback (most recent call last):
  6. ...
  7. subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
  8.  
  9. >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
  10. CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
  11. stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
  1.  
  1.  

4、subprocess.call()

官方解释:

Run command with arguments. Wait for command to complete or
timeout, then return the returncode attribute

 传入shell命令参数格式subprocess.check_call(["ls""-l"])

  1. 如果传入参数同时传入shell=True,则可以传入一个字符串shell命令而不是待执行的shell命令列表--subprocess.check_call("exit 1", shell=True)
    返回参数仅返回执行状态码,可通过把结果复制给某个变量查看,如果直接在linuxpython编译器执行该命令会直接显示命令执行的结果

    实例:
  1. >>> subprocess.call(['ls', '-l'])
  2. 总用量 160
  3. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  4. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  5. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  6. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  7. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  8. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  9. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  10. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面
  11. 0
  12. >>> subprocess.call('ls -l', shell=True)
  13. 总用量 160
  14. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  15. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  16. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  17. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  18. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  19. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  20. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  21. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面
  22. 0
  23. >>> subprocess.call(['ls', '-l'], stdout=subprocess.DEVNULL)
  24. 0
  25. >>> subprocess.call(['ls', '-l', '/test'])
  26. ls: 无法访问/test: 没有那个文件或目录
  27. 2

5、subprocess.check_call()

官方解释:

  1. Run command with arguments. Wait for command to complete. If
    the exit code was zero then return, otherwise raise
    CalledProcessError. The CalledProcessError object will have the
    return code in the returncode attribute.

check_call基本和call功能一样,只是增加了返回状态码校验,如果执行状态码是0,则返回0,否则抛出异常

实例:

  1. >>> subprocess.check_call(['ls', '-l'])
  2. 总用量 160
  3. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  4. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  5. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  6. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  7. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  8. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  9. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  10. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面
  11. 0
  12. >>> subprocess.check_call('ls -l', shell=True)
  13. 总用量 160
  14. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  15. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  16. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  17. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  18. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  19. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  20. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  21. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面
  22. 0
  23. >>> subprocess.check_call('ls -l /test', shell=True)
  24. ls: 无法访问/test: 没有那个文件或目录
  25. Traceback (most recent call last):
  26. File "<stdin>", line 1, in <module>
  27. File "/usr/lib/python3.4/subprocess.py", line 557, in check_call
  28. raise CalledProcessError(retcode, cmd)
  29. subprocess.CalledProcessError: Command 'ls -l /test' returned non-zero exit status 2

6、subprocess.check_output()

官方解释:

  1. Run command with arguments and return its output.
  2.  
  3. If the exit code was non-zero it raises a CalledProcessError. The
    CalledProcessError object will have the return code in the returncode
    attribute and output in the output attribute.
    执行命令,如果状态码是0,则返回执行结果,否则抛出异常--
    subprocess.check_output(["ls", "-l"])
  1. 如果传入参数同时传入shell=True,则可以传入一个字符串shell命令而不是待执行的shell命令列表--
  1. subprocess.check_call("exit 1", shell=True)
  1. 返回值包含cmd的执行结果,可以直接赋值给某个变量
  2.  
  3. 实例:
  1. >>> ret = subprocess.check_output(['ls', '-l'])
  2. >>> print(ret)
  3. b' \xe5\x85\xac\xe5\x85\xb1\xe7\x9a\x84\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe6\xa8\xa1\xe6\x9d\xbf\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe8\xa7\x86\xe9\xa2\x91\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe5\x9b\xbe\xe7\x89\x87\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe6\x96\x87\xe6\xa1\xa3\ndrwxr-xr-x 2 wader wader 4096 4\xe6\x9c\x88 13 2016 \xe4\xb8\x8b\xe8\xbd\xbd\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe9\x9f\xb3\xe4\xb9\x90\ndrwxr-xr-x 7 wader wader 4096 5\xe6\x9c\x88 26 2016 \xe6\xa1\x8c\xe9\x9d\xa2\n'
  4. >>> ret = subprocess.check_output(['ls', '-l'], universal_newlines=True)
  5. >>> print(ret)
  6. 总用量 160
  7. drwxr-xr-x 2 wader wader 4096 12 7 2015 公共的
  8. drwxr-xr-x 2 wader wader 4096 12 7 2015 模板
  9. drwxr-xr-x 2 wader wader 4096 12 7 2015 视频
  10. drwxr-xr-x 2 wader wader 4096 12 7 2015 图片
  11. drwxr-xr-x 2 wader wader 4096 12 7 2015 文档
  12. drwxr-xr-x 2 wader wader 4096 4 13 2016 下载
  13. drwxr-xr-x 2 wader wader 4096 12 7 2015 音乐
  14. drwxr-xr-x 7 wader wader 4096 5 26 2016 桌面

二、subprocess.Popen()类--用于执行复杂的系统命令

该类用于在一个新的进程中执行一个子程序。前面我们提到过,上面介绍的这些函数都是基于subprocess.Popen类实现的,通过使用这些被封装后的高级函数可以很方面的完成一些常见的需求。由于subprocess模块底层的进程创建和管理是由Popen类来处理的,因此,当我们无法通过上面哪些高级函数来实现一些不太常见的功能时就可以通过subprocess.Popen类提供的灵活的api来完成。

1、subprocess.Popen的构造函数

  1. def __init__(self, args, bufsize=-1, executable=None,
  2. stdin=None, stdout=None, stderr=None,
  3. preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
  4. shell=False, cwd=None, env=None, universal_newlines=False,
  5. startupinfo=None, creationflags=0,
  6. restore_signals=True, start_new_session=False,
  7. pass_fds=(), *, encoding=None, errors=None)

构造函数详细参数说明和其他实现过程可以参考对应subprocess库文件

参数说明:

  • args: 要执行的shell命令,可以是字符串,也可以是命令各个参数组成的序列。当该参数的值是一个字符串时,该命令的解释过程是与平台相关的,因此通常建议将args参数作为一个序列传递。
  • bufsize: 指定缓存策略,0表示不缓冲,1表示行缓冲,其他大于1的数字表示缓冲区大小,负数 表示使用系统默认缓冲策略。
  • stdin, stdout, stderr: 分别表示程序标准输入、输出、错误句柄。
  • preexec_fn: 用于指定一个将在子进程运行之前被调用的可执行对象,只在Unix平台下有效。
  • close_fds: 如果该参数的值为True,则除了0,1和2之外的所有文件描述符都将会在子进程执行之前被关闭。
  • shell: 该参数用于标识是否使用shell作为要执行的程序,如果shell值为True,则建议将args参数作为一个字符串传递而不要作为一个序列传递。
  • cwd: 如果该参数值不是None,则该函数将会在执行这个子进程之前改变当前工作目录。
  • env: 用于指定子进程的环境变量,如果env=None,那么子进程的环境变量将从父进程中继承。如果env!=None,它的值必须是一个映射对象。
  • universal_newlines: 如果该参数值为True,则该文件对象的stdin,stdout和stderr将会作为文本流被打开,否则他们将会被作为二进制流被打开。
  • startupinfo和creationflags: 这两个参数只在Windows下有效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如主窗口的外观,进程优先级等。

2. subprocess.Popen类的实例可调用的方法

方法 描述
Popen.poll() 用于检查子进程(命令)是否已经执行结束,没结束返回None,结束后返回状态码。
Popen.wait(timeout=None) 等待子进程结束,并返回状态码;如果在timeout指定的秒数之后进程还没有结束,将会抛出一个TimeoutExpired异常。
Popen.communicate(input=None, timeout=None) 该方法可用来与进程进行交互,比如发送数据到stdin,从stdout和stderr读取数据,直到到达文件末尾。
Popen.send_signal(signal) 发送指定的信号给这个子进程。
Popen.terminate() 停止该子进程。
Popen.kill() 杀死该子进程。

关于communicate()方法的说明:

  • 该方法中的可选参数 input 应该是将被发送给子进程的数据,或者如没有数据发送给子进程,该参数应该是None。input参数的数据类型必须是字节串,如果universal_newlines参数值为True,则input参数的数据类型必须是字符串。
  • 该方法返回一个元组(stdout_data, stderr_data),这些数据将会是字节穿或字符串(如果universal_newlines的值为True)。
  • 如果在timeout指定的秒数后该进程还没有结束,将会抛出一个TimeoutExpired异常。捕获这个异常,然后重新尝试通信不会丢失任何输出的数据。但是超时之后子进程并没有被杀死,为了合理的清除相应的内容,一个好的应用应该手动杀死这个子进程来结束通信。
  • 需要注意的是,这里读取的数据是缓冲在内存中的,所以,如果数据大小非常大或者是无限的,就不应该使用这个方法

3. subprocess.Popen使用实例

实例1、

  1. >>> import subprocess
  2. >>>
  3. >>> p = subprocess.Popen('df -Th', stdout=subprocess.PIPE, shell=True)
  4. >>> print(p.stdout.read())
  5. Filesystem Type Size Used Avail Use% Mounted on
  6. /dev/vda1 ext4 40G 12G 26G 31% /
  7. devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
  8. tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
  9. tmpfs tmpfs 3.9G 386M 3.5G 10% /run
  10. tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
  11. tmpfs tmpfs 783M 0 783M 0% /run/user/0
  12. tmpfs tmpfs 783M 0 783M 0% /run/user/1000

实例2

  1. >>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  2. >>> obj.stdin.write('print(1) \n')
  3. >>> obj.stdin.write('print(2) \n')
  4. >>> obj.stdin.write('print(3) \n')
  5. >>> out,err = obj.communicate()
  6. >>> print(out)
  7. 1
  8. 2
  9. 3
  10.  
  11. >>> print(err)

实例3

  1. >>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  2. >>> out,err = obj.communicate(input='print(1) \n')
  3. >>> print(out)
  4. 1
  5.  
  6. >>> print(err)

实例4

实现类似df -Th | grep data命令的功能,实际上就是实现shell中管道的共功能

  1. >>>
  2. >>> p1 = subprocess.Popen(['df', '-Th'], stdout=subprocess.PIPE)
  3. >>> p2 = subprocess.Popen(['grep', 'data'], stdin=p1.stdout, stdout=subprocess.PIPE)
  4. >>> out,err = p2.communicate()
  5. >>> print(out)
  6. /dev/vdb1 ext4 493G 4.8G 463G 2% /data
  7. /dev/vdd1 ext4 1008G 420G 537G 44% /data1
  8. /dev/vde1 ext4 985G 503G 432G 54% /data2
  9.  
  10. >>> print(err)
  11. None

三、总结

那么我们到底该用哪个模块、哪个函数来执行命令与系统及系统进行交互呢?下面我们来做个总结:

1、如果你的应用使用的Python 2.4以上,但是是Python 3.5以下的版本,Python官方给出的建议是使用subprocess.call()函数。Python 2.5中新增了一个subprocess.check_call()函数,Python 2.7中新增了一个subprocess.check_output()函数,这两个函数也可以按照需求进行使用

2、如果你的应用使用的是Python 3.5及以上的版本(目前应该还很少),Python官方给出的建议是尽量使用subprocess.run()函数

3、当subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()这些高级函数无法满足需求时,我们可以使用subprocess.Popen类来实现我们需要的复杂功能

不过经过个人试验认为getoutput、getstatusoutput方法使用比较便捷,subprocess适合个性化的执行

参考链接:https://www.cnblogs.com/yyds/p/7288916.html

python3之subprocess常见方法使用的更多相关文章

  1. python3的subprocess的各个方法的区别(-)

    subprocess(python3.7) subprocess 主要是为了替换一下的模块函数,允许你执行一些命令,并获取返回的状态码和 输入,输出和错误信息. os.systemos.spawn* ...

  2. C#图片处理常见方法性能比较

    C#图片处理常见方法性能比较 来自:http://www.cnblogs.com/sndnnlfhvk/archive/2012/02/27/2370643.html   在.NET编程中,由于GDI ...

  3. window对象中的常见方法

    <body><!-- window对象中的常见方法--><script type="text/javascript"> var timeid; ...

  4. python socket 常见方法及 简单服务/客户端

    socket 常见方法: 补充说明:what is file descriptor? 文件描述符是什么? 参考(http://stackoverflow.com/questions/8191905/w ...

  5. VBS操作Excel常见方法

    VBS操作Excel常见方法 作者: 字体:[增加 减小] 类型:转载 时间:2009-11-13我要评论 VBS控制Excel常见方法,需要的朋友可以参考下. dim oExcel,oWb,oShe ...

  6. UIPickerView常见属性、常见方法(包括代理方法和数据源方法)的一些说明

    一.UIPickerView 1.UIPickerView的常见属性 // 数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id< ...

  7. jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)

    在asp.net webForm开发中,用Jquery ajax调用aspx页面的方法常用的有两种:下面我来简单介绍一下. [WebMethod] public static string SayHe ...

  8. AJAX跨域的常见方法

    由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问.比如说你的网站域名是aaa.com,想要通过AJAX请求 ...

  9. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...

随机推荐

  1. Zookeeper 基本应用及盲点

    主要应用 From: https://segmentfault.com/a/1190000012185452 http://blog.fens.me/zookeeper-queue/ 原理: 应用zo ...

  2. 一个docker镜像中的目录删除不了问题

    在一个容器中,删除一个目录,失败: bash-4.2# pwd /home/zxcdn/ottcache/tomcat bash-4.2# uname -a Linux 3516b6c97679 -. ...

  3. php压力测试工具简单实用方法

    命令 ab -h 指令帮助 ab -n100 -c10 http://www.baidu.com 发起100个请求 并发数为10 设置测试地址是百度,注意测试测试时候请求数和并发数尽量设置低一点 Re ...

  4. 【375】COMP 9021 相关笔记

    1. Python 中的逻辑否定用 not 2. 对于下面的代码直邮输入整数才能运行,无论字符串或者浮点型都会报错 int(input('How many games should I simulat ...

  5. vue启动时报错,node-modules下xxx缺失

    从qq上拷贝了一个项目,解压后打开进vscode,安装依赖与scss后启动,显示node-modules下xxx指向缺失(想不起来是哪个缺失了),在网上找了很多解决办法,包括重新安装node 与 np ...

  6. 限制ssh登录ip和系统用户

    一般对于安全性要求比较高的系统,限制ssh登录的源ip地址和可以登录的系统账户是非常有必要的,ssh登录的源地址和可以登录的系统账户的设置在sshd的配置文件/etc/ssh/sshd_config中 ...

  7. Hosts

    Hosts "C:\Windows\System32\drivers\etc\hosts" [最新]2018 hosts 持续更新[更新于:2018-11-13] 本页面WordP ...

  8. (转)Python新手写出漂亮的爬虫代码2——从json获取信息

    https://blog.csdn.net/weixin_36604953/article/details/78592943 Python新手写出漂亮的爬虫代码2——从json获取信息好久没有写关于爬 ...

  9. 吴裕雄 python 爬虫(1)

    from urllib.parse import urlparse url = 'http://www.pm25x.com/city/beijing.htm' o = urlparse(url) pr ...

  10. 吴裕雄 python神经网络 手写数字图片识别(5)

    import kerasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers impo ...