最近工作需求中 有遇到这个情况 在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的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持菜鸟教程www.piaodoo.com。

python调用shell脚本的参数_使用python执行shell脚本 并动态传参 及subprocess的使用详解相关推荐

  1. python调用jar包的模块_使用 Python 的 JPype 模块调用 Jar 包

    背景与需求 最近学习并安装使用了HttpRunner框架去尝试做接口测试,并有后续在公司推广的打算. HttpRunner由Python开发,调用接口时需要依赖Python:而大多数公司的扩展工具包使 ...

  2. python怎么理解函数的参数_理解Python中函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...

  3. python调用exe程序 传入参数_关于使用c#调用python脚本文件,脚本文件需要传递参数...

    最近工作中需要干这个事,网上搜了搜资料,改了改,基本是这样 建立一个控制台应用程序: 比如 加入我在命令行直接调用python脚本,命令为 y安装python后,添加环境变量,path下面,加入路径. ...

  4. python中list作为函数参数_在python中list作函数形参,防止被实参修改的实现方法

    0.摘要 我们将一个list传入函数后,函数内部对实参修改后,形参也会随之改变.本文将主要介绍这种错误的现象.原因和解决方法. 1.代码示例 def fun(inner_lst): inner_lst ...

  5. python调用百度地图实现导航_利用python和百度地图API实现数据地图标注

    如题,先上效果图: image.png 主要分为两大步骤 使用python语句,通过百度地图API,对已知的地名抓取经纬度 使用百度地图API官网的html例程,修改数据部分,实现呈现效果 一.使用p ...

  6. 在Java中动态传参调用Python脚本

    最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...

  7. Python调用OpenStack API 《通过RESTful编写Python运维》

    目录 Python调用OpenStack API   <通过RESTful编写Python运维> 赛题实施 1. 认证服务:用户管理 (1&#x

  8. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  9. python os popen_python中的subprocess.Popen()使用详解

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

最新文章

  1. 实战:手把手教你实现用语音智能控制电脑 | 附完整代码
  2. Infineon第九届汽车电子开发者大会宣传视频
  3. 序列化--反序列化:Schema evolution in Avro, Protocol Buffers and Thrift
  4. nginx.conf配置格式
  5. LG P4899 [IOI2018] werewolf 狼人(kruskal重构树,二维数点)
  6. php软件开发--nginx服务器(待补充)
  7. mui框架 页面无法滚动解决方法
  8. 【译】在设计表单的时候应该注意的八点
  9. 好程序员web前端分享常见html5语义化标签
  10. c语言消去法解线性方程组,高斯消元法解线性方程组(C++实现)
  11. 条款2. 最好使用C++转型操作符
  12. 判断一个数是不是质数(素数)
  13. 关于pandas的时间序列中的freq频率参数如何设置的官方参考说明【以date_range方法中的freq参数举例】
  14. 次模优化·第〇集:简介
  15. Linux操作系统下的权限设置
  16. 数据挖掘-关联分析频繁模式挖掘Apriori、FP-Growth及Eclat算法的JAVA及C++实现
  17. web一阶段 day14
  18. C++接口实现汉字拼音转换
  19. 搭建3款远程开发环境:Pycharm、Jupyter notebook以及code-server
  20. 哈理工计算机学院学生会技术部,信息技术学院、软件学院学生会各部门工作职责...

热门文章

  1. 为什么要用枚举实现单例模式(避免反射、序列化问题)
  2. Dubbo与SpringCloud的架构与区别
  3. JavaScript 中的 window onload 应该什么时候写
  4. stm32的语音识别_基于stm32循迹避障语音控制金属探测蓝牙小车设计(原理图+pcb+源码+参考文档)...
  5. MyBatis中or和and的使用问题
  6. Java 多线程 —— 死锁与锁的错误用法
  7. linux 用dg分区,[bug报告] 兼容性问题,mbr硬盘使用分区扩容后linux系统不认分区...
  8. 神经网络的SGD、Momentum、AdaGrad、Adam最优化方法及其python实现
  9. java上机作业要注意什么_Java第八次上机作业
  10. python编程中的运算_Python编程中的四大运算法则