`

python subprocess shell=True False 的异同

阅读更多
参见:https://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess
一直对python的subprocess中shell=True 和shell=False(默认)一知半解,现在通过穷举各种用例来融会贯通

个人理解:
  • 1、subprocess.call 中的命令参数是list,如果命令是str,则被自动转为只有一个元素的list
  • 2、subprocess.call(str,shell=True) 等效于 os.system(str)
  • 3、subprocess.call(str,shell=True) 会像shell中一样进行 环境变量(比如$HOME)的替换
  • 4、subprocess.call([str1,str2],shell=True) 中str1为命令(可以含空格),而str2被认为是bash程序的参数


>>> import subprocess
>>> import os
>>> os.system("echo $HOME") #注意下面$HOME被替换为了cherishlc
/home/cherishlc
0
>>> os.system("echo $HOME".split(' ')) # os.system 的参数只能是一个str,而不是list
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be string, not list
>>> 
>>> subprocess.call("echo $HOME", shell=True) # 和os.system("echo $HOME")等效,$HOME被替换为了cherishlc
/home/cherishlc
0
>>> subprocess.call("echo $HOME".split(' '), shell=True) #实际上执行的是 "echo ", 而第二个参数$HOME 被认为是shell命令的参数,而非echo的参数

0
>>> subprocess.call("echo $HOME".split(' ')) #正常执行, 但是$$HOME不会被替换,在linux中等效于subprocess.call('echo "\$HOME"', shell=True)
$HOME
0
>>> subprocess.call('echo "\$HOME"', shell=True)
$HOME
0
>>> subprocess.call("echo haha") #  "echo haha"被认为是一个程序名去执行,当然,这个程序不存在,因而抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/subprocess.py", line 524, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
>>> subprocess.call(['echo $HOME','param no use'], shell=True)
/home/cherishlc
0


为什么推荐使用shell = False ? 这时,如何进行环境变量替换?
推荐使用shell = False 是因为windows和linux变量替换规则不同(个人猜测),
如需进行变量替换,可以通过os.environ中的环境变量进行替换;
此外还可以通过 env参数替换环境变量
>>> os.environ["HOME"]
'/home/cherishlc'
>>> subprocess.call('echo $HOME', shell=True, env={"HOME": "myhome"})
myhome
0

分享到:
评论

相关推荐

    基于 python subprocess 实现的定时任务系统源码.zip

    python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 ...

    python subprocess模块.docx

    而在Linux中,`shell=False`时调用`os.execvp()`,`shell=True`时则通过shell执行。 总的来说,`subprocess`模块为Python开发者提供了一种灵活的方式来创建和控制子进程,使得在执行外部命令、进行进程间通信等方面...

    python隐藏终端执行cmd命令的方法

    res = subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 这样打包后出来的程序就不会出现命令框,而且也能够正常运行了。 以上这篇python隐藏终端执行cmd...

    python subprocess 杀掉全部派生的子进程方法

    ### Python Subprocess 杀掉全部派生的子进程方法 #### 概述 在Python编程中,使用`subprocess`模块来执行外部命令或程序是非常常见的需求。然而,在某些场景下,我们需要能够有效地终止这些子进程及其所有派生的...

    Python调用shell命令常用方法(4种)

    ### Python调用Shell命令的四种常见方法 #### 方法一:使用`os`模块的`system`方法 在Python中,`os`模块提供了一系列与操作系统交互的接口,其中包括`system`函数,它允许我们直接执行Shell命令。此方法简单易用...

    对Python subprocess.Popen子进程管道阻塞详解

    问题产生描述 ... p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p.wait() # 从标准输出读出shell命令的输出结果 #rt = p.stdout.read().decode() #

    python调用shell脚本

    此外,如果你的shell脚本是bash脚本,你也可以考虑使用`os/exec`模块的`Popen`或`subprocess.Popen`,并将`shell=True`作为参数传递,这样Python就会使用系统默认的shell(通常是bash)来执行命令: ```python ...

    在python 中实现运行多条shell命令

    本文介绍了在Python中执行多条Shell命令的几种常见方法,包括使用`subprocess`模块、`os`模块以及编写Shell脚本并调用。每种方法都有其适用场景和局限性,开发者应根据具体需求选择最合适的方法。同时,在处理外部...

    python 执行shell命令并将结果保存的实例

    函数通过`subprocess.Popen`创建了一个子进程,其中`shell=True`允许我们传递一个字符串命令给shell执行,`stdout=subprocess.PIPE`和`stderr=subprocess.PIPE`使得我们可以读取子进程的标准输出和标准错误。...

    Python中subprocess模块用法实例详解

    &gt;&gt;&gt; subprocess.call(exit 1, shell=True) 1 测试调用系统中cmd命令,显示命令执行的结果: x=subprocess.check_output([echo, Hello World!],shell=True) print(x) Hello World! 测试在python中显示文件内容: y=...

    python调用shell命令

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 获取标准输出和标准错误输出 rf, ef = p.stdout, p.stderr errors = ef.read() if errors: print("ERROR:", ...

    PyPI 官网下载 | python-subprocess-utils-0.0.1.tar.gz

    Python Subprocess Utils 是一个Python开发的后端工具库,它扩展了Python标准库中的`subprocess`模块,提供了更方便的方式来管理和控制子进程。在Python编程中,`subprocess`模块是用于创建新的进程、连接到它们的...

    Python如何通过subprocess调用adb命令详解

    c_line = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] if c_line.find("List of devices attached") return None return c_line.split("\t")[0]....

    使用python执行shell脚本 并动态传参 及subprocess的使用详解

    `shell=True`表示通过shell来执行命令,而`shell=False`则直接执行命令,此时`args`应该是一个元组,元组的第一项是命令,其余项是参数。 `Popen`对象提供了几个方法,如`poll()`用于检查子进程是否已经结束,返回`...

    Python获取命令实时输出-原样彩色输出并返回输出结果的示例

    经试验显示效果不错。 #!/usr/bin/python3 # -*- coding: utf-8 -*- import os import subprocess # 与在命令窗口执行显示效果相同,如有... p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, std

    python中subprocess批量执行linux命令

    ret = subprocess.call(["ls", "-l"], shell=False) ``` 或者 ```python ret = subprocess.call("ls -l", shell=True) ``` `subprocess.check_call()`与`subprocess.call()`类似,但会检查命令的退出状态码。如果...

    Python subprocess模块常见用法分析

    本文实例讲述了Python subprocess模块常见用法。...subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令 示例如下: &gt;&gt;

    python模块之subprocess模块级方法的使用

    - `check=False`: 如果设置为`True`,当命令的返回值不为0时,将引发`CalledProcessError`异常。 - `**kwargs`: 其他关键字参数,这些参数会被传递给`Popen`构造函数。 **示例**: ```python import subprocess ...

Global site tag (gtag.js) - Google Analytics