python基础--subprocess模块
可以执行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模块的更多相关文章
- python基础——第三方模块
		
python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的. 如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了. 如果你正在使用Window ...
 - python基础——使用模块
		
python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...
 - 二十五. Python基础(25)--模块和包
		
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
 - Python中subprocess 模块 创建并运行一个进程
		
python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex ...
 - python的subprocess模块(写的不错留作查询)
		
python的subprocess模块 subprocess模块是python从2.4版本开始引入的模块.主要用来取代 一些旧的模块方法,如os.system.os.spawn*.os.popen*. ...
 - python 基础之 模块
		
Python 基础之模块 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文 ...
 - python  利用python的subprocess模块执行外部命令,获取返回值
		
有时执行dos命令需要保存返回值 需要导入库subprocess import subprocess p = subprocess.Popen('ping www.baidu.com', shell= ...
 - Python基础之模块:6、hashlib模块   subprocess模块   logging模块
		
目录 一.hashlib模块 1.简介 2.基本操作与用法 二.subprocess模块 1.简介 2.基本操作与用法 三.logging模块 1.简介 2.基本操作与用法 一.hashlib模块 1 ...
 - 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将内 ...
 
随机推荐
- rsync同步公网yum源搭建本地yum仓库
			
镜像同步公网yum源上游yum源必须要支持rsync协议,否则不能使用rsync进行同步. centos源:rsync://rsync.mirrors.ustc.edu.cn/centos/ epel ...
 - 小议主子表INT自增主键插入记录的方法SQL server]教程
			
http://www.chinesejy.com/jishu/508/519/2006061781665.html 主子表最常见的大概就是用在进销存.MRP.ERP里面,比如一张销售订单,订单Orde ...
 - python学习笔记__反射
			
反射 # 通过字符串的形式对对象中的成员进行操作(获取/查找/添加/删除). 操作的内置函数: 1.获取 getattr(object, name) # 去对象object中获取name的内容 c ...
 - 初学SQL语句练习2
			
-- 子查询 --单行子查询-- 查询出所有比雇员姓名为“CLARK ”工资高的员工的信息 SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM EMP ...
 - python3中SSLError错误处理
			
在deepin中安装了python3.6,安装路径为/usr/local/python36,然后通过deepin自带的python2.7的pip安装了virtualenv: sudo pip inst ...
 - Casting a Classifier into a Fully Convolutional Network将带全连接的网络做成全卷积网络
			
详见:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb 假设使用标准的caffe ...
 - angularJS__v1.5.6点击同一个菜单刷新
			
针对angularjs的1.0版本,点击菜单不刷新问题,只需在配置路由时,路由路径添加“/”,如,点击 标签时,就会刷新,
 - Linux查看服务器公网ip的方法
			
在解决网络问题时,需要查看本机的出口公网IP信息,有如下两个方法: curl ifconfig.me 在linux系统中输入上述的命令,可以查看到本机连接的公网信息: 如果该命令无效,可以使用下面一个 ...
 - MySQL学习(一)——Java连接MySql数据库
			
MySQL学习(一)——Java连接MySql数据库 API详解: 获得语句执行 String sql = "Insert into category(cid, cname) values( ...
 - 四、Kafka 核心源码剖析
			
一.Kafka消费者源码介绍 1.分区消费模式源码介绍 分区消费模式直接由客户端(任何高级语言编写)使用Kafka提供的协议向服务器发送RPC请求获取数据,服务器接受到客户端的RPC请求后,将数据构造 ...