Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >调用 subprocess 时小心 shell=True

调用 subprocess 时小心 shell=True

作者头像
测试开发囤货
发布于 2023-05-25 09:19:58
发布于 2023-05-25 09:19:58
99400
代码可运行
举报
文章被收录于专栏:测试开发囤货测试开发囤货
运行总次数:0
代码可运行
小心调用 subprocess,避免因 shell=True 而命令行解析错误

Python 中的 subprocess 模块可以轻松实现执行外部命令和进程的功能。我们经常会用它来调用一些命令行工具的功能。但是在使用 subprocess 调用复杂命令时,有一个容易犯但影响比较大的错误 - 使用shell=True参数,导致命令行解析错误,子进程执行失败。

举例1

第一次遇到这个问题的场景是,我在一个项目中需要使用 Airtest 框架生成测试报告。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmd = [
    "airtest", 
    "report",
    "air",
    "--log_root",
    "log_dir",
    "--outfile", 
    "log.html"
]
ret = subprocess.call(cmd, shell=True, cwd="suites")

执行后,报告文件并没有生成。经检查发现, vérité 因为 shell=True 将 airtest report air ... 这个命令作为一个字符串传给 shell 执行,导致命令行被错误解析,子进程实际上失败执行。

解决方法也很简单,只需要删除 shell=True 参数,直接传入命令列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ret = subprocess.call(cmd, cwd="suites") 

这样,命令行被正确解析为多个参数,子进程执行成功,报告文件生成正常。

举例2

再举一个例子,一次我希望通过 subprocess 执行 ps -ef | grep python 查找所有 Python 进程,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmd = "ps -ef | grep python"
subprocess.call(cmd, shell=True)

执行后,这个命令同样会解析失败,因为管道符号 | 被 shell 作为字符串传递,而不是真实的管道。

解决同样是删除 shell=True,传入命令列表实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cmd = ["ps", "-ef", "|", "grep", "python"]
subprocess.call(cmd)

现在管道可以正常工作,命令执行成功。

总结

综上,调用 subprocess 执行复杂命令时,如果不必要,最好避免使用 shell=True。直接传入命令列表,可以最大限度避免命令行解析错误的问题。只有当命令必须由 shell 处理时,例如需要变量替换,才使用 shell=True。记录这个教训,在将来调用 subprocess 时多加注意,可以避免很多定制错误和调试时间,让代码更稳定。controllers 和 timeframe 数据结构

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试开发囤货 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python模块学习:subprocess模块详解
subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法,如:
Python学习者
2023/08/26
1.9K0
Python中os.system()、subprocess.run()、call()、check_output()的用法
os.system() 是对 C 语言中 system() 系统函数的封装,允许执行一条命令,并返回退出码(exit code),命令输出的内容会直接打印到屏幕上,无法直接获取。
Python学习者
2023/07/28
9720
Python Subprocess库详解
Subprocess库是Python中用于创建和管理子进程的标准库。它提供了一个强大而灵活的接口,使得你可以在Python中启动新的进程、连接它们的输入和输出,并与它们进行交互。本教程将介绍Subprocess库的基本概念、用法和一些常见的应用场景。
Michel_Rolle
2024/02/04
2.9K0
python—subprocess、gl
运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。
py3study
2020/01/09
1.6K0
Python模块之subprocess用法实例详解
subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。
菲宇
2019/06/13
26.7K0
记录Python 调用 subprocess.Popen 卡死解决办法
subprocess.Popen 是 Python 中用于执行外部命令或程序的模块之一。它提供了创建子进程并与之交互的灵活方式。以向 subprocess.Popen 传递一个命令字符串或命令列表,它将调用操作系统的 shell 来执行该命令。
用户4945346
2024/02/17
2.3K0
记录Python 调用 subprocess.Popen 卡死解决办法
Python用subprocess的Popen来调用系统命令
当我们须要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。可是这两个命令过于简单,不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出,推断该命令的执行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完毕我们须要的操作。在这里对Popen予以简介。
全栈程序员站长
2022/07/05
2.1K0
Python调用Shell命令 (python, shell 混合编程)
Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库,也当然可以用Python调用Shell命令。
Python学习者
2024/04/28
4590
subprocess实用手册
subprocess模块主要用于创建子进程,并连接它们的输入、输出和错误管道,获取它们的返回状态。通俗地说就是通过这个模块,你可以在Python的代码里执行操作系统级别的命令,比如“ipconfig”、“du -sh”等等。
千往
2019/08/07
1.1K0
Python 执行系统命令
Python 编程过程中经常会用到系统命令,本文记录实现方法。 系统命令 作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有以下方式 os.system() os.popen() subprocess 模块 os.system 执行命令但无法获取取命令输出时,可以使用 os.system os.system() 是C语言 system() 函数的封装,返回命令的退出状态码,命令执行结果输出到标准输出(stdout/窗口)。 system函数可以将
为为为什么
2022/08/10
1.9K0
python中的subprocess
这个模块允许您开启进程、连接输入、输出和错误的管道,并获取他们的返回代码。这个模块计划替代一些旧代码,如:
py3study
2020/01/07
1.7K0
Python模块之subprocess
一 简介 在使用Python 开发MySQL自动化相关的运维工具的时候,遇到一些有意思的问题,本文介绍Python的 subprocess 模块以及如何和MySQL交互具体操作,如启动 ,关闭 ,备份数据库。 二 基础知识 Python2.4引入subprocess模块来管理子进程,可以像Linux 系统中执行shell命令那样fork一个子进程执行外部的命令,并且可以连接子进程的output/input/error管道,获取命令执行的输出,错误信息,和执行成功与否的结果。 Subprocess 提供了三个函数以不同的方式创建子进程。他们分别是 2.1 subprocess.call() 父进程等待子进程完成,并且返回子进程执行的结果 0/1 其实现方式
用户1278550
2018/08/09
2.1K0
python subprocess模块
subprocess模块 允许你生成一个或多个进程,并且可以跟它交互,并且获取返回的结果,这个模块想要替换掉几个老的方法: os.system os.spawn* 所以以后跟系统交互的命令,尽量用subprocess 建议调用subprocess的run()方法去跟系统进行调用,更高级的方法,使用popen() ;run()方法其实就是封装的popen。 run()方法在python3.5才有,python2.x没有,2.x用subprocess.call
py3study
2020/01/07
1.1K0
python的subprocess模块
1 os与commands模块 ​ 2 subprocess模块 ​ 3 subprocess.Popen类
py3study
2020/01/07
3.2K0
Python调用系统命令的六种方法
作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system()、os.popen()、subprocess.popen()、subprocess.call()、subprocess.run()、subprocess.getstatusoutput()六种方法。
吾非同
2020/12/07
4.2K0
Python调用系统命令的六种方法
【module】subprocess
subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn、os.popen、commands.*等subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。
py3study
2020/01/02
2K0
并行处理(二)、subprocess模块
subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。
狼啸风云
2023/10/07
4570
python之系统命令
以上执行shell命令的相关的模块和函数的功能均在 subprocess 模块中实现,并提供了更丰富的功能。
菲宇
2019/06/13
1.2K0
python调用shell命令小结
 在写python脚本的时候,经常需要调用系统命令,常用的python调用系统命令的方法主要有subprocess.call和os.popen。默认情况下subprocess.call的方法结果是返回值,即1或0,而os.popen则是命令运行的结果,可以用readlines(读取所有行,返回数组)或者read(读读取所有行,返回str)来读取。
py3study
2020/01/06
1.4K0
python 标准类库-并行执行之subprocess-子进程管理
以下函数是调用子进程的推荐方法,所有使用场景它们都能处理。也可用Popen以满足更高级的使用场景
授客
2019/09/11
4.4K0
python 标准类库-并行执行之subprocess-子进程管理
相关推荐
Python模块学习:subprocess模块详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验