使用python执行shell脚本 并动态传参 及subprocess的使用详解


Posted in Python onMarch 06, 2020

最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数

执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库

subprocess这个模块可以非常方便的启动一个子进程,并且控制其输入和输出

Class Popen(args,bufsize = 0,executable=None,
  stdin =None,stdout =None,stderr =None,
  preexec_fn = None,close_fds = False,shell = False,
  cwd = None,env = None,universal_newlines = False,
  startupinfo = None,creationflags = 0):

参数是:

args 应该是一个字符串,或一系列程序参数。要执行的程序通常是args序列或字符串中的第一项,但可以使用可执行参数进行显式设置。

在UNIX上,与shell=False(默认):在这种情况下,POPEN 类使用os.execvp()来执行子程序。 args通常应该是一个序列。一个字符串将被视为一个字符串作为唯一项目(要执行的程序)的序列。

在UNIX上,使用shell = True:如果args是一个字符串,则它指定要通过shell执行的命令字符串。如果args是一个序列,则第一个项目指定命令字符串,并且任何其他项目将被视为附加的shell参数。

可以先创建一个简单的shell脚本 a.sh

$1 $2 分别代表传进脚本的 第一个和第二个参数

使用python执行shell脚本 并动态传参 及subprocess的使用详解

使用python执行shell脚本 并动态传参 及subprocess的使用详解

如果不写shell=True,默认为shell=False,需要在args的第一个参数指定执行器路径

使用python执行shell脚本 并动态传参 及subprocess的使用详解

bufsize 如果给出,bufsize与内建的open()函数的相应参数具有相同的含义:0表示无缓冲,1表示行缓冲,任何其他正值意味着使用(大约)该大小的缓冲区。负bufsize意味着使用系统默认值,通常意味着完全缓冲。bufsize的默认值是0(无缓冲)。

stdin,stdout和stderr分别指定执行的程序的标准输入,标准输出和标准错误文件句柄。有效值是PIPE,现有文件描述符(正整数),现有文件对象和 None。 PIPE表示应该创建一个新的管道给孩子。随着无,则不会发生重定向; 孩子的文件句柄将从父类继承。另外,stderr 可以是STDOUT,它表示应用程序的stderr数据应该被捕获到与stdout相同的文件句柄中。

在Popen对象中,可以设值subprocess.stdout=PIPE 即通过管道 p.stdout.read()取出 该进程的标准输出

preexec_fn 如果将preexec_fn设置为可调用对象,则该对象将在子进程执行前被调用。

如果close_fds为true,则在执行子进程之前,将关闭除0,1和2之外的所有文件描述符。

如果shell为true,则指定的命令将通过shell执行。

如果cwd不是None,那么在执行子代之前,当前目录将更改为cwd。

如果env不是None,它将为新进程定义环境变量。

如果设置universal_newlines为true,则文件对象stdout和stderr将作为文本文件打开,但可能会有\ n,Unix行尾约定\ r,Macintosh约定或\ r \ n中的任何行终止, Windows约定。所有这些外部表示被Python程序视为\ n。注意:此功能仅在Python是使用通用换行支持(默认)构建时才可用。此外,文件对象stdout,stdin和stderr的newlines属性不会被communications()方法更新。

如果设置了STARTUPINFO和creationflags,将被传递到下层的CreateProcess()函数。他们可以指定诸如主窗口的外观和新过程的优先级等内容。(仅限Windows)

Popen对象的一些方法

Popen.poll() 检查子进程是否终止,返回对象的returncode

Popen.wait() 等待子进程完成,阻塞。返回returncode

Popen.communicate(input=None) 将信息输入到进程,从stdout和stderr中读取数据,直到达到文件结尾。等待进程终止。可选的stdin参数应该是要发送到子进程的字符串,如果没有数据应发送给子进程,则为None。

返回一个元组(stdout,stderr) 但是读取的数据缓存在内存中,所以如果数据量很大或者无限,就不要使用这种方法

Popen.pid 返回子进程的pid

Popen.returncode 读取进程的状态码

None —— 子进程尚未结束;
==0 —— 子进程正常退出;
> 0—— 子进程异常退出,returncode对应于出错码;
< 0—— 子进程被信号杀掉了。

Popen.kill() 杀死进程

以上这篇使用python执行shell脚本 并动态传参 及subprocess的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用map函数来完成Python并行任务的简单示例
Apr 02 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
Python3处理HTTP请求的实例
May 10 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
python BeautifulSoup库的安装与使用
Dec 17 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 #Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 #Python
python批量替换文件名中的共同字符实例
Mar 05 #Python
python批量修改xml属性的实现方式
Mar 05 #Python
python修改linux中文件(文件夹)的权限属性操作
Mar 05 #Python
Python实现在Windows平台修改文件属性
Mar 05 #Python
Pycharm最常用的快捷键及使用技巧
Mar 05 #Python
You might like
php列出一个目录下的所有文件的代码
2012/10/09 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
奥地利网上书店:Weltbild
2017/07/14 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
2014迎新年晚会策划方案
2014/02/23 职场文书
护校行动方案
2014/05/31 职场文书
高中同学会活动方案
2014/08/14 职场文书
电力培训学习心得体会
2016/01/11 职场文书