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 相关文章推荐
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
浅谈Python中的闭包
Jul 08 Python
Python中几种导入模块的方式总结
Apr 27 Python
PyTorch学习笔记之回归实战
May 28 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
Python实现的列表排序、反转操作示例
Mar 13 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
python实现FTP循环上传文件
Mar 20 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
Python3中最常用的5种线程锁实例总结
Jul 07 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
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
JavaScript 特殊字符
2007/04/05 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
Python八皇后问题解答过程详解
2019/07/29 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
python实现简单坦克大战
2020/03/27 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
美的官方商城:Midea
2016/09/14 全球购物
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
质检员的岗位职责
2013/11/15 职场文书
家长给小学生的评语
2014/01/30 职场文书
大学生家政服务项目创业计划书
2014/01/30 职场文书
小学生美德少年事迹
2014/02/02 职场文书
运动会开幕式解说词
2014/02/05 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
普通党员整改措施
2014/10/24 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
留学推荐信怎么写
2015/03/26 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技