可以执行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. 20165218 《网络对抗技术》Exp1 逆向及Bof基础

    Exp1 逆向及Bof基础 基础知识 1. NOP, JNE, JE, JMP, CMP汇编指令的机器码 指令 机器码 NOP NOP指令即"空指令",在x86的CPU中机器码为0 ...

  2. Struts2的配置文件中, <package>的作用,<action><result>重名?

    问:Struts2的配置文件中, <package>的作用是什么? 答:防止action重名啊,例如前台和后台,总会有很多地方起名重复的! 问:可是访问的时候,不也是访问action吗,能 ...

  3. 加ico

    <link rel="icon" type="text/css" href="/favicon.png" />

  4. 发现视口(窗口)自适应的新大陆!!vw、vh

    从事前端已经1年了,一直为背景自适应铺满整个屏幕而苦苦发愁,因为要适配不同的pc显示器,所以高度不能写死,但是写(height:100%)并不能实现,愁死我了~我要不用写好的css框架实现或者自己写j ...

  5. OpenStack 认证服务 KeyStone连接和用户管理(四)

    连接keystone两种方式: 一种使用命令 一种使用环境变量 1.通过环境变量方式连接keystone(适合在初始化场景使用) 配置认证令牌环境变量 export OS_TOKEN=07081849 ...

  6. OC中线程安全的单例

    @implementation MySingleton + (instancetype)sharedInstance { static MySingleton* instance = nil; sta ...

  7. JavaScript中数组迭代方法

    文章来源 : https://www.cnblogs.com/shuiyi/p/5058524.html

  8. wsimport生成客户端 指定编码格式

    wsimport -encoding utf- -keep -s D:\temp -p com.lawyer.user -verbose http://服务地址?wsdl -encoding : 指定 ...

  9. git fatal: The remote end hung up unexpectedly 错误

    使用git将本地项目添加到远程仓库报以下错误 $ git push -u origin master fatal: The remote end hung up unexpectedly | 11.0 ...

  10. 如何创建一个https的站点(超简单) 以及 IIS7.5绑定Https域名

    1.申请免费1年的ssl证书(传送门:https://common-buy.aliyun.com/?spm=5176.2020520163.cas.29.N0xOPM&commodityCod ...