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

最近工作需求中 有遇到这个情况 在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 分别代表传进脚本的 第一个和第二个参数

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

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的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python下调用Linux的Shell命令的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 1.1. os模块的exec方法族 Python的exec系统方法同Unix的exec系统调用是一致的.这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回.( 这个看了点 help(os)  --> search "exec" 的相关介绍,但是没

  • 对python中执行DOS命令的3种方法总结

    1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. 使用Popen模块产生新的process 现在大部分人都喜欢使用Popen.Popen方法不会打印出cmd在linux上执行的信息.的确,Popen非常强大,支持多种参数和模式.使用前需要from subprocess import Popen, PIPE.但是Popen函数有一个缺陷,就是它是一个阻塞的方

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

    最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subprocess这个模块可以非常方便的启动一个子进程,并且控制其输入和输出 Class Popen(args,bufsize = 0,executable=None, stdin =None,stdout =None,stderr =None, preexec_fn = None,close_fds =

  • 详解python执行shell脚本创建用户及相关操作

    用户发送请求,返回帐号和密码 ###利用框架flask 整体思路: # 目的:实现简单的登录的逻辑 # 1需要get和post请求方式 需要判断请求方式 # 2获取参数 # 3执行shell # 4如果判断都没问题,就返回结果 导包 ... 给模版传递消息 用flash --需要对内容加密,因此需要设置 secret_key , 做加密消息的混淆 app = Flask(__name__) app.secret_key = 'kingdomai' 使用wtf实现表单,需要自定义一个表单类 #va

  • vue路由传参三种基本方式详解

    这篇文章主要介绍了vue路由传参三种基本方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现有如下场景,点击父组件的li元素跳转到子组件中,并携带参数,便于子组件获取数据. 父组件中: <li v-for="article in articles" @click="getDescribe(article.id)"> methods: 方案一: getDescribe(id) { // 直接调用$r

  • C# 总结QueueUserWorkItem传参几种方式案例详解

    最近在学习citrix的xenserver6.2的源代码,发现多处用到System.Threading命名空间下的ThreadPool.QueueUserWorkItem方法: public static bool QueueUserWorkItem(WaitCallback callBack, object state); publicstaticbool QueueUserWorkItem(WaitCallback callBack); 参数WaitCallback 本身是一个delegat

  • shell脚本中常见的一些特殊符号和作用详解

    在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1.{} 大括号: 用法一:通配符扩展 eg: ls my_{finger,toe}s 这条命令相当于如下命令的组合: ls my_fingers my_toes eg: mkdir {userA,userB,userC}-{home,bin,data} 我们将得到 userA-home, userA-bin, userA-data, userB-home, user

  • 利用Shell脚本循环读取文件中每一行的方法详解

    前言 本文主要给大家介绍了关于使用Shell脚本循环读取文件每一行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.使用for循环 for line in `cat filename` do echo $line done 或者 for line in $(cat filename) do echo $line done 二.使用while循环 while read -r line do echo $line done < filename While循环中rea

  • bash脚本中将密码传递给ssh/scp命令方法详解

    安装SSHPASS 对于大多数最新的操作系统,sshpass软件包在默认软件包存储库中可用.可以使用以下命令在系统上安装它. 在Debian上: $ sudo apt install sshpass 在CentOS上: $ yum --enablerepo = epel -y install sshpass 使用SSHPASS sshspass使用sshspass环境变量存储用户密码.需要首先使用sshspass变量和密码,然后使用此命令.下面是一个使用sshspass的简单shell脚本. e

  • vuejs路由的传参及路由props配置详解

    目录 前言 方式1-使用query方式 命名路由 方式2-路由的params参数 query与params的区别 路由的props配置 路由配置的布尔模式 路由配置的对象模式 路由配置函数模式 总结 前言 在Vue项目里,去实现左侧菜单边栏多级内容的展示,导航的切换,以及内容链接的跳转等,用的都是前端路由vue-router,它的重要性,不可言喻 下面介绍一下Vue中的路由传参以及路由的prps配置 方式1-使用query方式 这里循环遍历一个列表为例,query的方式,跳转的url后面携带的一

  • python执行shell获取硬件参数写入mysql的方法

    本文实例讲述了python执行shell获取硬件参数写入mysql的方法.分享给大家供大家参考.具体分析如下: 最近要获取服务器各种参数,包括cpu.内存.磁盘.型号等信息.试用了Hyperic HQ.Nagios和Snmp,它们功能都挺强大的,但是于需求不是太符,亦或者太heavy. 于是乎想到用python执行shell获取这些信息,python执行shell脚本有以下三种方法: 1. os.system() 复制代码 代码如下: os.system('ls') #返回结果0或者1,不能得到

  • python 执行shell命令并将结果保存的实例

    方法1: 将shell执行的结果保存到字符串 def run_cmd(cmd): result_str='' process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result_f = process.stdout error_f = process.stderr errors = error_f.read() if errors: pass result_str =

随机推荐