可以执行shell命令的相关模块和函数有:

  • os.system
  • os.spawn*
  • os.popen*          --废弃
  • popen2.*           --废弃
  • commands.*      --废弃,3.x中被移除

以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能

call

父进程等待子进程完成
返回退出信息(returncode,相当于Linux exit code)

执行命令,返回状态码,shell=True是表示命令可以字符串

>>> import subprocess
>>> ret=subprocess.call(["ls","-l"],shell=False)
total 4
-rw-r--r--. 1 root root 260 Feb 23 20:44 scrapy.cfg
drwxr-xr-x. 4 root root 156 Feb 25 20:05 sokindle
>>> ret=subprocess.call("ls -l",shell=True)
total 4
-rw-r--r--. 1 root root 260 Feb 23 20:44 scrapy.cfg
drwxr-xr-x. 4 root root 156 Feb 25 20:05 sokindle

check_call

父进程等待子进程完成
返回0
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查

shell默认为False,在Linux下,shell=False时, Popen调用os.execvp()执行args指定的程序;shell=True时,如果args是字符串,Popen直接调用系统的Shell来执行args指定的程序,如果args是一个序列,则args的第一项是定义程序命令字符串,其它项是调用系统Shell时的附加参数。

>>> ret=subprocess.check_call(["ls","-l"])
total 4
-rw-r--r--. 1 root root 260 Feb 23 20:44 scrapy.cfg
drwxr-xr-x. 4 root root 156 Feb 25 20:05 sokindle
>>> print(ret)
0
>>> subprocess.check_call("exit 1",shell=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/python36/lib/python3.6/subprocess.py", line 291, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1.
>>> subprocess.call("exit 1",shell=True)
1

>>>

check_output,类似check_call

执行命令,如果状态码是 0 ,则返回执行结果,否则抛异常

subprocess.Popen(...)

用于执行复杂的系统命令

参数:

    • args:shell命令,可以是字符串或者序列类型(如:list,元组)
    • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
    • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
    • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
    • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
      所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
    • shell:同上
    • cwd:用于设置子进程的当前目录
    • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
    • universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
    • startupinfo与createionflags只在windows下有效
      将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
>>> import subprocess
>>> subprocess.Popen(["mkdir","t1"])
<subprocess.Popen object at 0x7f7419f0fac8>
>>> ret1=subprocess.Popen(["mkdir","t1"])
>>> mkdir: cannot create directory ‘t1’: File exists >>> ret2=subprocess.Popen("mkdir t2",shell=True)
>>> ret2=subprocess.Popen("ls -l",shell=True)
>>> total 4
-rw-r--r--. 1 root root 260 Feb 23 20:44 scrapy.cfg
drwxr-xr-x. 4 root root 156 Feb 25 20:05 sokindle
drwxr-xr-x. 2 root root 6 May 25 21:29 t1
drwxr-xr-x. 2 root root 6 May 25 21:30 t2
>>> obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/',)
>>> obj = subprocess.Popen("ls -l",shell=True,cwd='/home',)
>>> total 23464
drwxr-xr-x. 5 root root 59 Mar 5 17:18 crawl
drwxr-xr-x. 3 root root 38 Feb 19 11:40 douban
drwxr-xr-x. 3 root root 39 Mar 1 20:52 douban2
drwxr-xr-x. 5 root root 159 Aug 17 2016 features
drwxr-xr-x. 3 root root 18 Feb 25 19:52 images
drwx------. 14 lx lx 4096 Mar 2 20:59 lx
drwxr-xr-x. 22 root root 4096 Aug 17 2016 plugins
-rw-r--r--. 1 root root 24015561 Mar 7 20:53 PyDev_5.2.0.zip
drwxr-xr-x. 4 root root 78 May 13 21:52 python
drwxr-xr-x. 2 root root 6 Feb 16 20:22 python36
drwxr-xr-x. 5 root root 60 May 25 21:30 sokindle
drwxr-xr-x. 2 root root 6 May 25 21:36 t3
drwxr-xr-x. 3 root root 122 Feb 17 21:13 tutorial

如果要把结果输出到屏幕需要用subprocess.PIPE

例:

  ret=subprocess.Popen("ls -l",stdout=subprocess.PIPE,shell=True)

  ret.stout.read()

  上面正确

  如果是这样

  ret=subprocess.Popen("ls -l",shell=True)

  ret.stout.read()没有read函数

  结果--》pipe管道--》stdout

  read stdout读取pipe管道

  每调用subprocess就开启一新的shell进程

  检查程序是否执行完或者卡住

  比如:res=subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

    如果没有执行完调用 res.stdout.read()返回的为b''

    res.poll()还回None没有执行完,为0执行完

    res.wait()等执行完,返回结果

    res.terminate()杀死shell

import  subprocess

ret=subprocess.Popen("python",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

ret.stdin.write(b"print('11')\n")
ret.stdin.write(b"print(222)\n")
ret.stdin.write(b"print(333)\n")
ret.stdin.write(b"print(444)\n")
ret.stdin.close() out=ret.stdout.read()
ret.stdout.close() err=ret.stderr.read()
print(out.decode("utf-8"))
print(err)
"""
结果
11
222
333
444 b''
"""

python基础--subprocess模块的更多相关文章

  1. python基础——第三方模块

    python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的.  如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了.  如果你正在使用Window ...

  2. python基础——使用模块

    python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...

  3. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

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

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

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

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

  6. python 基础之 模块

    Python 基础之模块 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文 ...

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

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

  8. Python基础之模块:6、hashlib模块 subprocess模块 logging模块

    目录 一.hashlib模块 1.简介 2.基本操作与用法 二.subprocess模块 1.简介 2.基本操作与用法 三.logging模块 1.简介 2.基本操作与用法 一.hashlib模块 1 ...

  9. Day6 - Python基础6 模块shelve、xml、re、subprocess、pymysql

    本节目录: 1.shelve模块 2.xml模块 3.re模块 4.subprocess模块 5.logging模块 6.pymysql 1.shelve 模块 shelve模块是一个简单的k,v将内 ...

随机推荐

  1. BZOJ 50题纪念?

    是的,这次的纪念帖也比较磕碜-- 但是还有更磕碜的↓↓↓ 2017年6月7日,我在我的旧博客发了个bzoj10题纪念-- 那时我还是一个又young又simple的菜鸡(现在可能也是--),省选之后觉 ...

  2. 【BZOJ3518】点组计数

    Description 平面上摆放着一个\(n*m\)的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c是不同的3个点,其顺序 ...

  3. 洛谷 P3171 [CQOI2015]网络吞吐量 解题报告

    P3171 [CQOI2015]网络吞吐量 题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最 ...

  4. Android 5.0 Lollipop SDK下载地址(PASS)

    Android 5.0 ARM EABI v7a System Image https://dl-ssl.google.com/android/repository/sys-img/google_ap ...

  5. Codeforces 901C. Bipartite Segments(思维题)

    擦..没看见简单环..已经想的七七八八了,就差一步 显然我们只要知道一个点最远可以向后扩展到第几个点是二分图,我们就可以很容易地回答每一个询问了,但是怎么求出这个呢. 没有偶数简单环,相当于只有奇数简 ...

  6. Html 响应式 Web

    网格视图 很多网页都是基于网格设计的,这说明网页是按列来布局的. 使用网格视图有助于我们设计网页.这让我们向网页添加元素变的更简单. 响应式网格视图通常是 12 列,宽度为100%,在浏览器窗口大小调 ...

  7. IDA error of " positive sp value has been found"

    问:用IDA静态分析,函数结尾出现 endp ; sp-analysis failed 用F5调不出伪代码,不知道是什么原因,请问有什么解决办法没有? 答:endp ; sp-analysis fai ...

  8. 音视频处理之FFmpeg+SDL+MFC视频播放器20180411

    一.FFmpeg+SDL+MFC视频播放器 1.MFC知识 1).创建MFC工程的方法 打开VC++ 文件->新建->项目->MFC应用程序 应用程序类型->基于对话框 取消勾 ...

  9. codeforces div1 & div2 参与人员分数统计

    Analysis helps to see the nature of things.

  10. 浏览器json数据格式化

    在浏览器上作接口测试的时候看到json 格式的数据是密密麻麻的一片,眼睛都花了..  如: 设置方法:  chrome  的右上角选择,然后---  更多工具---  扩展程序  ----   JSO ...