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采用raw_input读取输入值的方法
Aug 18 Python
python中字符串前面加r的作用
Jun 04 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
python实现媒体播放器功能
Feb 11 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
详解PyTorch批训练及优化器比较
Apr 28 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
python机器学习实现决策树
Nov 11 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
python转化excel数字日期为标准日期操作
Jul 14 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桌面中心(二) 数据库写入
2007/03/11 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
php compact 通过变量创建数组
2016/11/15 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
完善的jquery处理机制
2016/02/21 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
实例解析jQuery中如何取消后续执行内容
2016/12/01 Javascript
js 动态生成json对象、时时更新json对象的方法
2016/12/02 Javascript
JS实现复制功能
2017/03/01 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
python实现杨辉三角思路
2017/07/14 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Python logging模块用法示例
2018/08/28 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
航空大学应届生求职信
2013/11/10 职场文书
学校四群教育实施方案
2014/06/12 职场文书
超市周年庆活动方案
2014/08/16 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技