使用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, 标题和描述中提到的知识点主要涉及使用Python执行shell脚本并动态传递参数,以及Python的`subprocess`模块的使用。`subprocess`模块是Python内置的一个强大的子进程管理工具,能够方便地创建和管理子进程,同时还能控制其输入、输出和错误流。 在Python中,使用`subprocess`模块执行shell脚本的方式主要有两种: 1. **不使用shell解释器**(`shell=False`): 当`shell`参数设为`False`时,`args`应该是一个序列,其中第一个元素是你要执行的程序,其余元素是参数。例如,如果你有一个名为`a.sh`的shell脚本,需要传入两个参数,你可以这样编写: ```python import subprocess cmd = ['a.sh', 'arg1', 'arg2'] subprocess.Popen(cmd) ``` 这种方式不依赖于shell解释器,更安全,但需要确保`a.sh`是一个可执行文件。 2. **使用shell解释器**(`shell=True`): 如果`shell`参数设为`True`,`args`可以是一个字符串,其中包含了要通过shell执行的命令。例如: ```python import subprocess cmd = 'a.sh arg1 arg2' subprocess.Popen(cmd, shell=True) ``` 这种方式会通过shell解释器执行命令,允许使用shell的特殊语法,如管道、重定向等,但可能存在安全性问题,因为命令字符串可能受到注入攻击。 `subprocess.Popen`类的参数说明: - `args`: 执行的程序或命令。 - `bufsize`: 缓冲区大小,0表示无缓冲,1表示行缓冲,正整数表示缓冲区大小,负数表示使用系统默认值。 - `stdin`, `stdout`, `stderr`: 控制子进程的输入、输出和错误流。可以是`PIPE`、文件描述符、文件对象或`None`。 - `preexec_fn`: 子进程执行前调用的函数。 - `close_fds`: 是否在子进程执行前关闭除0, 1, 2外的文件描述符,默认为`False`。 - `shell`: 是否通过shell执行命令,默认为`False`。 - `cwd`: 子进程的当前工作目录。 - `env`: 子进程的环境变量,可以覆盖默认的环境变量。 - `universal_newlines`: 是否以统一的换行符处理输出,默认为`False`。 `subprocess.Popen`对象的方法: - `poll()`: 检查子进程是否已结束,返回`returncode`属性的值。 - `wait()`: 阻塞直到子进程结束,返回`returncode`。 - `communicate(input=None)`: 发送`input`数据给子进程,读取子进程的`stdout`和`stderr`,直到结束。返回一个包含`stdout`和`stderr`的元组。 - `pid`: 获取子进程的进程ID(PID)。 - `returncode`: 获取子进程的退出状态码,如果进程还没结束则为`None`。 使用`subprocess`时,需要注意以下几点: - 安全性:使用`shell=True`时要小心,避免命令注入攻击。如果可能,尽量使用列表形式的`args`。 - 错误处理:检查`returncode`来判断子进程是否成功执行,`returncode`非零表示有错误。 - 输入/输出管理:根据需要选择合适的`stdin`, `stdout`, `stderr`设置,避免数据丢失或内存溢出。 - 资源释放:使用`communicate()`或`wait()`来确保子进程资源被正确关闭。 `subprocess`模块是Python中用于执行外部命令和管理子进程的强大工具,能够灵活地控制子进程的行为,适应各种不同的系统需求。在实际应用中,可以根据具体场景选择合适的方式来执行shell脚本和传递参数。































- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【推荐下载】世界经济达沃斯:人工智能驱动工业4.0变革(1).doc
- 会计经验:计算机记账的基本要求(1).doc
- 软件工程毕业设计-c语言课程设计学生学籍信息管理系统(1).doc
- C语言专业课程设计之杂志订阅管理(1)(1).doc
- 人工智能应用于高职英语口语教学的教学设计研究(1).docx
- 电子商务-外文翻译-外文文献-英文文献-电子商务在马来西亚中小企业的应用(1).doc
- 基于微信平台的o2o电子商务模式分析大学论文(1).doc
- PHP开篇教学设计(1).docx
- 互联网+背景下高校图书馆电子信息资源建设分析(1).docx
- 学校信息化建设发展规划49244.doc
- 软件项目系统验收流程图以及过程说明(1).docx
- 中职计算机教学中的项目教学法应用探讨(1).docx
- 计算机基础知识考试试卷全套备考资料(1).doc
- 如何在EXCEL表格中批量插入对应图片-最新更新.doc
- 互联网金融模式下小微企业融资问题探讨(1).docx
- 大数据时代心得体会(1)(1).doc


