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 实现微信公众号粉丝迁移流程
Jan 03 Python
Tensorflow卷积神经网络实例
May 24 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 Python
python数值基础知识浅析
Nov 19 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
Python使用Matlab命令过程解析
Jun 04 Python
python实现批量命名照片
Jun 18 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和ACCESS写聊天室(七)
2006/10/09 PHP
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
PHP分页类集锦
2014/11/18 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
prototype.js的Ajax对象
2006/09/23 Javascript
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
Python设计模式之抽象工厂模式
2016/08/25 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
python取均匀不重复的随机数方式
2019/11/27 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python 获取计算机的网卡信息
2021/02/18 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
土木工程应届生求职信
2013/10/31 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
后天观后感
2015/06/08 职场文书
边城读书笔记
2015/06/29 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
《青山不老》教学反思
2016/02/22 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript