subprocess中命令为参数序列和字符串的区别
参数args
参数args可以是一个参数序列,也可以是一个单独的字符串。参数序列通常是首选的,因为它允许模块处理参数的转义和引号(例如,允许文件名中有空格)。
如果传递参数序列,默认情况下,程序执行序列的第一个元素,后面所有的元素都作为参数。
如果传一个单独字符串,要么参数shell为True,要么字符串必须没有指定任何参数的可执行程序的名称。
所以,一般的搭配是参数序列和shell=False,字符串和shell=True。
参数shell
shell参数设置是否在单独的shell中执行命令。如果shell=True,则是派生一个新的shell来解释执行命令。如果你使用Python主要是为了增强它在大多数系统shell上提供的控制流,并且还想方便的访问shell特性,如shell的管道符、文件通配符、环境变量扩展或者~扩展到home目录等,这个参数将非常有用。
不同平台下shell参数使用
shell=False
对于Unix平台,如果args是字符串,这个字符串将被解释为程序的名称或路径,然后被执行。然而,这仅仅只有在不给这个程序传递任何参数时才能被执行。
import subprocess
subprocess.Popen('ls', shell=False) # get the result
subprocess.Popen('ls', shell=False) # raise Exception: FileNotFoundError
对于windows平台,如果args是个序列,它将被转换成一个字符串通过以下方式:Converting an argument swquence to a string on Windows ,这是因为底层的CreateProcess()只能操作字符串。
shell=True
在Unix平台下shell=True,shell默认为/bin/sh。如果args是字符串,通过shell执行字符串指定的命令。这意味着字符串的格式必须与在shell提示符下键入时的格式完全相同。例如, 使用引号或反斜杠转义包含空格的文件名。如果args是一个序列,第一个元素指定了命令字符串,其它的元素他的参数。
在Windows平台下shell=True,环境变量COMSPEC指定了默认的shell。只有当你想要执行的命令内置于shell中时,你才需要指定shell=True(例如dir或copy)。运行批处理文件或基于控制台的可执行文件不需要shell=True。
args的参数序列和字符串的区别
这里的字符串指的是
shell=True下的字符串
- 使用序列不需要派生一个新的shell解释器。所以比字符串更快一点
- 使用shell参数容易引起shell注入漏洞,使用shlex.quote() 函数可以正确转义空格和shell命令中的元字符
参考
subprocess中命令为参数序列和字符串的区别的更多相关文章
- Python 中命令行参数解析工具 docopt 安装和应用
什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...
- Perl中命令行参数以及打开管道文件
打开管道文件 Linux提供了管道机制,可以方便应用程序之间的数据传递.在Perl中,扣开和使用管道可采用如下形式的open函数: open(Filehandle,”丨 CMD”); 其中 ...
- python中命令行参数
python中的命令行参数 python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 le ...
- C++ 中的不定参数与格式化字符串 # ## vsprintf
日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下. 格式化字符串有很多方法: snprintf std::stringstream # ##的使用 ##是一个连接符号,用于把参数连在一 ...
- c语言中命令行参数argc,argv[]详解
main(int argc,char *argv[ ]) 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[ ...
- js中substr,substring,slice。截取字符串的区别
substr(n1,n2) n1:起始位置(可以为负数) n2:截取长度(不可以为0,不可以为负数,可以为空) 当n1为正数时,从字符串的n1下标处截取字符串(起始位置),长度为n2. 当n1为负数时 ...
- Java实验课:命令行参数是什么?
命令行参数:在命令行中给定的参数就是命令行参数.(即从输入位置角度理解). 命令行的参数 1. 什么是命令行的参数? 如: java Test1 365 156 "China" ( ...
- c/c++ main 函数命令行参数的使用
C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用 ...
- VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。
首先,这是个历史遗留问题,说起来比较复杂.其次,这个问题在微软的MSDN博客上已经专门被说起过了,英文好的请直接移步到原文:<VC++ Directories>.另外,stack over ...
随机推荐
- Sql Server中使用特定字符分割字符串
在T-SQL中我们经常批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.这里将字符串分割以table形式输出 语法如下: SET ANSI_NUL ...
- SpringCloud OpenFeign Post请求的坑
在微服务开发中SpringCloud全家桶集成了OpenFeign用于服务调用,SpringCloud的OpenFeign使用SpringMVCContract来解析OpenFeign的接口定义. 但 ...
- canvas学习作业,模仿做一个祖玛的小游戏
这个游戏的原理我分为11个步骤,依次如下: 1.布局, 2.画曲线(曲线由两个半径不同的圆构成) 3.画曲线起点起始圆和曲线终点终止圆 4.起始的圆动起来, 5.起始的圆沿曲线走起来 6.起始的圆沿曲 ...
- ams入门了解
另一篇介绍文 https://www.cnblogs.com/clds/p/4985893.html 转载自https://www.cnblogs.com/onlysun/p/4533798.htm ...
- 修改python包pip下载国内源
第一种方式- pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 附国内常用镜像源:阿里云:https:// ...
- dubbo学习(四)配置dubbo 注解方式配置
provider(生产者) service注解暴露服务 /** * 用户管理实现类 */ @Service //用的dubbo的注解,表明这是一个分布式服务 @Component //注册为sprin ...
- 刷题[HFCTF2020]EasyLogin
前置知识 node.js koa框架常用目录,文件 js弱类型语言,空数组与整数1比较时,返回turue jwt令牌 博客讲解: 关于jwt的讲解: http://www.ruanyifeng.com ...
- android开发之意图
intent 全局变量传值(程序关闭时存储值消失) intent普通传值 intent传值 intent不能序列化传值 intent回传
- Python-反向迭代和实现反向迭代
案例: 实现一个连续的浮点数发生器,FloatRange,根据给定范围(start, end) 和步进值,产生一些列的浮点数,例如:FloatRange(3,4,0.2),将产生下列序列: 正向:3. ...
- 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...