参数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(例如dircopy)。运行批处理文件或基于控制台的可执行文件不需要shell=True

args的参数序列和字符串的区别

这里的字符串指的是shell=True下的字符串

  • 使用序列不需要派生一个新的shell解释器。所以比字符串更快一点
  • 使用shell参数容易引起shell注入漏洞,使用shlex.quote() 函数可以正确转义空格和shell命令中的元字符

参考

subprocess中命令为参数序列和字符串的区别的更多相关文章

  1. Python 中命令行参数解析工具 docopt 安装和应用

    什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...

  2. Perl中命令行参数以及打开管道文件

    打开管道文件   Linux提供了管道机制,可以方便应用程序之间的数据传递.在Perl中,扣开和使用管道可采用如下形式的open函数:   open(Filehandle,”丨 CMD”);   其中 ...

  3. python中命令行参数

    python中的命令行参数 python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 le ...

  4. C++ 中的不定参数与格式化字符串 # ## vsprintf

    日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下. 格式化字符串有很多方法: snprintf std::stringstream # ##的使用 ##是一个连接符号,用于把参数连在一 ...

  5. c语言中命令行参数argc,argv[]详解

    main(int argc,char *argv[ ]) 1.argc为整数 2.argv为指针的指针(可理解为:char **argv or: char *argv[] or: char argv[ ...

  6. js中substr,substring,slice。截取字符串的区别

    substr(n1,n2) n1:起始位置(可以为负数) n2:截取长度(不可以为0,不可以为负数,可以为空) 当n1为正数时,从字符串的n1下标处截取字符串(起始位置),长度为n2. 当n1为负数时 ...

  7. Java实验课:命令行参数是什么?

    命令行参数:在命令行中给定的参数就是命令行参数.(即从输入位置角度理解). 命令行的参数 1. 什么是命令行的参数? 如: java Test1 365 156 "China" ( ...

  8. c/c++ main 函数命令行参数的使用

    C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用 ...

  9. VS2010中VC++目录和C/C++之间的区别。VC++ Directories和C/C++的区别。

    首先,这是个历史遗留问题,说起来比较复杂.其次,这个问题在微软的MSDN博客上已经专门被说起过了,英文好的请直接移步到原文:<VC++ Directories>.另外,stack over ...

随机推荐

  1. day51:django:dispatch&模板渲染&过滤器&标签&组件&静态文件配置

    目录 1.dispatch 2.模板渲染 3.过滤器 4.标签 5.组件 6.静态文件配置 dispatch 回顾:CBV对应的URL传参 urls.py url(r'^book/(\d+)/(\d+ ...

  2. Linux中逻辑卷(LV)的创建、增大和减小

    首先说一下在缩小逻辑卷的时候要注意的问题:第一步使用resize2fs命令更改文件系统的容量:第二步使用lvreduce命令减小逻辑卷的容量.这两个顺序千万不要搞反了,而且要保证缩减后的逻辑卷容量大于 ...

  3. svn的使用学习

    一:安装 1.svn安装包,语言包下载 地址:https://pan.baidu.com/s/1PFM7ya_hNJM-v979KgCpgA 提取码:mpxq 2.运行下载的TortoiseSVN程序 ...

  4. SSTI服务器模板注入(以及关于渲染,solt的学习)&&[BJDCTF2020]The mystery of ip 1

    ssti服务器模板注入 ssti:利用公共 Web 框架的服务器端模板作为攻击媒介的攻击方式,该攻击利用了嵌入模板的用户输入方式的弱点.SSTI 攻击可以用来找出 Web 应用程序的内容结构. slo ...

  5. websocket+sockjs+stompjs详解及实例

    最近有项目需求要用到websocket,刚开始以为很简单,但是随着遇到问题,深入了解,才知道websocket并不是想象中的那么简单,这篇文章主要是考虑websocket在客户端的使用. 1.http ...

  6. Book of Shaders 00 - 使用 VS Code 编写 GLSL

    0x00 写在前面 最近在学习由 Patricio 编写的 The Book of Shaders,这是一本关于 Fragment Shaders(片段着色器)的入门指南.为了在一个相对熟悉的平台运行 ...

  7. 对offsetof、 container_of宏和结构体的理解

    offsetof 宏 #include<stdio.h> #define offsetoff(type, member)      ((int)&((type*)0)->me ...

  8. Python实现的数据结构与算法之双端队列详解

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  9. Visual Studio中Debug与Release以及x86、x64、Any CPU的区别 &&&& VS中Debug与Release、_WIN32与_WIN64的区别

    本以为这些无关紧要的 Debug与Release以及x86.x64.Any CPU 差点搞死人了. 看了以下博文才后怕,难怪我切换了一下模式,程序就pass了.... 转载: 1.https://ww ...

  10. 固件(Firmware)

    来源:https://baike.baidu.com/item/%E5%9B%BA%E4%BB%B6/627829 固件   固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EE ...