Run()方法

>>> a = subprocess.run(['df','-h'])
文件系统 容量 已用 可用 已用% 挂载点
udev 468M 0 468M 0% /dev
tmpfs 98M 7.4M 91M 8% /run
/dev/sda1 39G 5.0G 32G 14% /
tmpfs 488M 216K 488M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 488M 0 488M 0% /sys/fs/cgroup
tmpfs 98M 84K 98M 1% /run/user/1000
>>> a
CompletedProcess(args=['df', '-h'], returncode=0)
>>> a.returncode # 获取命令执行结果的状态码
0
>>> a.args # 获取命令参数列表
['df', '-h']

直接把命令按照列表传入

如果想要读取命令执行的结果和错误,需要通过管道

>>> a = subprocess.run(['df','-h'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.stdout # 如果命令执行成功就能读出执行结果
b'\xe6\x96\x87\xe4\xbb\xb6\xe7\xb3\xbb\xe7\xbb\x9f \xe5\xae\xb9\xe9\x87\x8f \xe5\xb7\xb2\xe7\x94\xa8 \xe5\x8f\xaf\xe7\x94\xa8 \xe5\xb7\xb2\xe7\x94\xa8% \xe6\x8c\x82\xe8\xbd\xbd\xe7\x82\xb9\nudev 468M 0 468M 0% /dev\ntmpfs 98M 7.4M 91M 8% /run\n/dev/sda1 39G 5.0G 32G 14% /\ntmpfs 488M 216K 488M 1% /dev/shm\ntmpfs 5.0M 4.0K 5.0M 1% /run/lock\ntmpfs 488M 0 488M 0% /sys/fs/cgroup\ntmpfs 98M 84K 98M 1% /run/user/1000\n'
>>> a.stdout.decode()
'文件系统 容量 已用 可用 已用% 挂载点\nudev 468M 0 468M 0% /dev\ntmpfs 98M 7.4M 91M 8% /run\n/dev/sda1 39G 5.0G 32G 14% /\ntmpfs 488M 216K 488M 1% /dev/shm\ntmpfs 5.0M 4.0K 5.0M 1% /run/lock\ntmpfs 488M 0 488M 0% /sys/fs/cgroup\ntmpfs 98M 84K 98M 1% /run/user/1000\n'
>>> a.stderr # 如果命令执行成功,读取的错误就为空
b''
>>> a = subprocess.run(['df','-asdh'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.stdout.decode() # 如果命令执行错误,读出来的执行结果就为空
''
>>> a.stderr # 如果命令执行错误,就能读出错误的内容
b"df\xef\xbc\x9a\xe6\x97\xa0\xe6\x95\x88\xe9\x80\x89\xe9\xa1\xb9 -- s\nTry 'df --help' for more information.\n"
>>> a.stderr.decode()
"df:无效选项 -- s\nTry 'df --help' for more information.\n"

stdout=subprocess.PIPE为命令执行成功返回的内容

stderr=subprocess.PIPE为命令执行错误返回的错误内容

因为执行一条命令就会打开一个进程,进程间数据不能通信,所以操作系统对stdout、stderr的结果进行读取,再传给程序

subprocess.run()方法执行命令时,如果命令是错的,程序不会报错而继续运行,如果要命令错的时候程序报错停止运行的话,可以加个check参数

check参数设置为True的时候就会检查命令是否是错的

>>> a = subprocess.run(['df','-asdh'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.stderr.decode()
"df:无效选项 -- s\nTry 'df --help' for more information.\n"
>>> a = subprocess.run(['df','-asdh'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,check=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/subprocess.py", line 708, in run
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['df', '-asdh']' returned non-zero exit status 1

执行带有管道符的命令

>>> a = subprocess.run('df -h |grep sda1',stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
>>> a
CompletedProcess(args='df -h |grep sda1', returncode=0, stdout=b'/dev/sda1 39G 5.0G 32G 14% /\n', stderr=b'')

Call()方法

执行命令,返回命令执行状态

>>> retcode = subprocess.call(['df', '-h'])
文件系统 容量 已用 可用 已用% 挂载点
udev 468M 0 468M 0% /dev
tmpfs 98M 7.4M 91M 8% /run
/dev/sda1 39G 5.0G 32G 14% /
tmpfs 488M 216K 488M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 488M 0 488M 0% /sys/fs/cgroup
tmpfs 98M 84K 98M 1% /run/user/1000
>>> retcode
0

执行命令,如果命令执行状态为0,就正常返回,否则抛异常

>>> subprocess.check_call(['df', '-h'])
文件系统 容量 已用 可用 已用% 挂载点
udev 468M 0 468M 0% /dev
tmpfs 98M 7.4M 91M 8% /run
/dev/sda1 39G 5.0G 32G 14% /
tmpfs 488M 216K 488M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 488M 0 488M 0% /sys/fs/cgroup
tmpfs 98M 84K 98M 1% /run/user/1000
0
>>> subprocess.check_call(['df', '-ash'])
df:无效选项 -- s
Try 'df --help' for more information.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/subprocess.py", line 581, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['df', '-ash']' returned non-zero exit status 1

接收字符串格式命令,返回元组形式,第1个元素是执行状态,第2个是命令结果

>>> subprocess.getstatusoutput('whoami')
(0, 'sch01ar')

接收字符串格式命令,并返回结果

>>> subprocess.getoutput('whoami')
'sch01ar'

执行命令,并返回结果

>>> subprocess.check_output(['df','-h']).decode()
'文件系统 容量 已用 可用 已用% 挂载点\nudev 468M 0 468M 0% /dev\ntmpfs 98M 7.4M 91M 8% /run\n/dev/sda1 39G 5.0G 32G 14% /\ntmpfs 488M 216K 488M 1% /dev/shm\ntmpfs 5.0M 4.0K 5.0M 1% /run/lock\ntmpfs 488M 0 488M 0% /sys/fs/cgroup\ntmpfs 98M 84K 98M 1% /run/user/1000\n'
>>> a = subprocess.check_output(['df','-h']).decode()
>>> a
'文件系统 容量 已用 可用 已用% 挂载点\nudev 468M 0 468M 0% /dev\ntmpfs 98M 7.4M 91M 8% /run\n/dev/sda1 39G 5.0G 32G 14% /\ntmpfs 488M 216K 488M 1% /dev/shm\ntmpfs 5.0M 4.0K 5.0M 1% /run/lock\ntmpfs 488M 0 488M 0% /sys/fs/cgroup\ntmpfs 98M 84K 98M 1% /run/user/1000\n'

Popen()方法

popen()方法执行命令的进程和主程序的进程为并行

>>> subprocess.run(['sleep','10'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
CompletedProcess(args=['sleep', '10'], returncode=0, stdout=b'', stderr=b'')
>>> subprocess.Popen(['sleep','10'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
<subprocess.Popen object at 0x7f7fe17adda0>

subprocess.run()睡眠10秒之后才返回,subprocess.Popen()直接返回

>>> a = subprocess.Popen(['sleep','10'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.wait()
0

wait()会等待进程结束

>>> a = subprocess.Popen(['whoami'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.stdout.read() # 读取命令执行成功的结果
b'sch01ar\n'
>>> a.stderr.read() # 读取命令执行错误的结果
b''
>>> a.poll() #检查子进程是否已终止,返回返回值
0
>>> a.args # 返回命令参数
['whoami']
>>> a.pid # 返回当前命令的进程号
24999
>>> a.returncode # 返回返回值
0

terminate():给系统发信号,终止所启动的进程,不一定会终止

kill():杀死所启动的进程

communicate():与启动的进程交互,发送数据到stdin,并从stdout接收输出,然后等待任务结束

>>> a = subprocess.Popen(['python3','test.py'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.communicate('sch01ar')
(b"a\x7fa.cco\t'ch01ar')\n", b'')

communicate()只能与启动的进程交互一次

send_signal():发送系统信号

>>> a = subprocess.Popen(['sleep','30'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.send_signal(signal.SIGKILL)

preexec_fn:只在Unix平台下有效,用于指定一个函数,它将在子进程运行之前被调用

>>> def test():
... print('This is a test')
...
>>> a = subprocess.Popen(['whoami'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,preexec_fn=test)
>>> a.stdout.read()
b'This is a test\nsch01ar\n'

cwd:用于设置子进程的当前目录

>>> a = subprocess.Popen('echo $PWD',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> a.stdout.read()
b'/home/sch01ar\n'
>>> a = subprocess.Popen('echo $PWD',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,cwd='/home/sch01ar/Desktop/')
>>> a.stdout.read()
b'/home/sch01ar/Desktop\n'

shell的作用跟subprocess.run()方法中的shell作用一样

env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承

Python模块-subprocess模块的更多相关文章

  1. Python中subprocess 模块 创建并运行一个进程

     python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex ...

  2. python的subprocess模块(写的不错留作查询)

    python的subprocess模块 subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system.os.spawn*.os.popen*. ...

  3. python 利用python的subprocess模块执行外部命令,获取返回值

    有时执行dos命令需要保存返回值 需要导入库subprocess import subprocess p = subprocess.Popen('ping www.baidu.com', shell= ...

  4. Python全栈之路----常用模块----subprocess模块

    我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...

  5. python之subprocess模块详解--小白博客

    subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码.这个模 ...

  6. python中subprocess模块

    subprocess  模块 subprocess称之为子进程,进程是一个正在进行的程序 子进程是由另一个正在运行的程序启动的程序,例如QQ聊天点击一个链接,打开了浏览器,那么浏览器称之为QQ的子进程 ...

  7. python的subprocess模块执行shell命令

    subprocess模块可以允许我们执行shell命令 一般来说,使用run()方法就可以满足大部分情况 使用run执行shell命令 In [5]: subprocess.run('echo &qu ...

  8. Python之Subprocess模块

    PS:打开文件时候加b参数是代表以二进制方式打开,在Linux加不加都可以,在windows上面最好加b参数否则可能会出现问题 使用system返回执行结果不赋值,使用popen返回了结果赋值给cmd ...

  9. Python之subprocess模块、sys模块

    一.subprocess模块 # import os # os.system('tasklist') #类似cmd输入系统命令 ''' subprocess的目的就是启动一个新的进程并且与之通信. s ...

  10. python基础--subprocess模块

    可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 commands.* ...

随机推荐

  1. 使用微软官方U盘制作软件来安装纯净版windows

    第一步:下载一个制作U启的工具;windows-usb-dvd-download-tool 微软官网:https://www.microsoft.com/en-us/download/windows- ...

  2. jQuery横向手风琴

    在线演示 本地下载

  3. 20145210姚思羽《网络对抗技术》逆向及Bof基础实践

    20145210姚思羽<网络对抗技术>逆向及Bof基础实践 实践目标 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo ...

  4. 剑指offer——树中两个节点的最低公共祖先

    代码来源与<剑指offer> 得到从根节点开始到输入的两个结点的两条,需要遍历两次树,每遍历一次的时间复杂度是O(n),得到的两条路径的长度在最差情况时是O(n),通常情况下两条路径的长度 ...

  5. 斐波那契 (Fibonacci)数列

    尾递归会将本次方法的结果计算出来,直接传递给下个方法.效率很快. 一般的递归,在本次方法结果还没出来的时候,就调用了下次的递归, 而程序就要将部分的结果保存在内存中,直到后面的方法结束,再返回来计算. ...

  6. 大话设计模式--工厂方法模式 Factory Method -- C++实现

    1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...

  7. 红米1S刷机

    1. http://www.miui.com/thread-7371342-1-1.html http://www.miui.com/download-226.html#306 http://www. ...

  8. AOP学习(2)

    <property name="interceptorNames"> <!-- 相当于包MyMethodBeforeAdvice前置通知和代理对象关联,我们 也可 ...

  9. Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化

    对其用户和应用程序来讲,每一个VPS平台的运行和管理都与一台独立主机完全相同,因为每一个VPS均可独立进行重启并拥有自己的root访问权限.用户.IP地址.内存.过程.文件.应用程序.系统函数库以及配 ...

  10. LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘

    The Sorted String Table (SSTable) is one of the most popular outputs for storing, processing, and ex ...