python中subprocess批量执行linux命令


Posted in Python onApril 27, 2018

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

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

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

subprocess

call

执行命令,返回状态码

>>> import subprocess
>>> ret = subprocess.call(["ls", "-l"], shell=False)
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
>>> ret = subprocess.call("ls -l", shell=True)
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
>>> print(ret)
0

check_call

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

>>> subprocess.check_call(["ls", "-l"])
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
0
>>> subprocess.check_call("exit 1", shell=True)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 581, in check_call
  raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

check_output

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

>>> subprocess.check_output(["echo", "Hello World!"])
b'Hello World!\n'
>>> subprocess.check_output("exit 1", shell=True)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 626, in check_output
  **kwargs).stdout
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 708, in run
  output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

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
>>> ret1 = subprocess.Popen(["mkdir","t1"])
>>> ret2 = subprocess.Popen("mkdir t2", shell=True)
>>> print(ret1)
<subprocess.Popen object at 0x7f4d7609dd30>
>>> print(ret2)
<subprocess.Popen object at 0x7f4d7609dc18>

终端输入的命令分为两种:

  • 输入即可得到输出,如:ifconfig
  • 输入进行某环境,依赖再输入,如:python
>>> import subprocess
>>> obj = subprocess.Popen("mkdir t3", shell=True, cwd='/tmp/',)
>>> import subprocess
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> obj.stdin.write("print(1)\n")
9
>>> obj.stdin.write("print(2)")
8
>>> obj.stdin.close()
>>> cmd_out = obj.stdout.read()
>>> obj.stdout.close()
>>> cmd_error = obj.stderr.read()
>>> obj.stderr.close()
>>> print(cmd_out)
1
2
>>> print(cmd_error)
>>> import subprocess
>>> 
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> obj.stdin.write("print(1)\n")
9
>>> obj.stdin.write("print(2)")
8
>>> 
>>> out_error_list = obj.communicate()
>>> print(out_error_list)
('1\n2\n', '')
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> out_error_list = obj.communicate('print("hello")')
>>> print(out_error_list)
('hello\n', '')
Python 相关文章推荐
Python计算字符宽度的方法
Jun 14 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
Python格式化日期时间操作示例
Jun 28 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
在windows下使用python进行串口通讯的方法
Jul 02 Python
python实现udp聊天窗口
Mar 31 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
keras slice layer 层实现方式
Jun 11 Python
python图片合成的示例
Nov 09 Python
Python使用windows设置定时执行脚本
Nov 12 Python
python复制文件到指定目录的实例
Apr 27 #Python
Python多进程multiprocessing.Pool类详解
Apr 27 #Python
python获取程序执行文件路径的方法(推荐)
Apr 26 #Python
python中的文件打开与关闭操作命令介绍
Apr 26 #Python
python3获取当前文件的上一级目录实例
Apr 26 #Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 #Python
python3中获取文件当前绝对路径的两种方法
Apr 26 #Python
You might like
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
Python中super的用法实例
2015/05/28 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
个人简历自我评价范文
2014/02/04 职场文书
领导失职检讨书
2014/02/24 职场文书
安全教育演讲稿
2014/05/09 职场文书
通知函的格式
2015/04/27 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript