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编程中的字符串
Oct 14 Python
Python 列表理解及使用方法
Oct 27 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
django rest framework 过滤时间操作
Jul 12 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
PHP正则验证Email的方法
2015/06/15 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
有趣的bootstrap走动进度条
2016/12/01 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
社区健康教育工作方案
2014/06/03 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
九九重阳节标语
2014/10/07 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
体育个人工作总结
2015/02/09 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python