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获取远程图片大小和尺寸的方法
Mar 26 Python
Python_LDA实现方法详解
Oct 25 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
django配置app中的静态文件步骤
Mar 27 Python
python 星号(*)的多种用途
Sep 21 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 Python
python 使用三引号时容易犯的小错误
Oct 21 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
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
php自动加载代码实例详解
2021/02/26 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
JS面向对象编程详解
2016/03/06 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
东方电视购物:东方CJ
2016/10/12 全球购物
学习十八大报告感言
2014/02/04 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
义和团口号
2014/06/17 职场文书
商铺门前三包责任书
2014/07/25 职场文书
入党积极分子考察意见
2015/06/02 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
团队拓展训练感想
2015/08/07 职场文书
关于公司年会的开幕词
2016/03/04 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python
浅谈JavaScript作用域
2021/12/06 Javascript