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 pdb调试方法分享
Jan 21 Python
python动态性强类型用法实例
May 09 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python 列表中[ ]中冒号‘:’的作用
Apr 30 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
python实现文件的分割与合并
Aug 29 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
Python grpc超时机制代码示例
Sep 14 Python
golang中的空接口使用详解
Mar 30 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
function.inc.php超越php
2006/12/09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
python gdal安装与简单使用
2019/08/01 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
pycharm导入源码的具体步骤
2020/08/04 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
村道德模范事迹材料
2014/08/28 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
行政处罚事先告知书
2015/07/01 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python
Mysql 设置boolean类型的操作
2021/06/04 MySQL