`

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隐藏终端执行cmd命令的方法

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

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

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

    Python中subprocess学习.docx

    它的构造函数如下: subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False,...

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

    下面小编就为大家带来一篇python subprocess 杀掉全部派生的子进程方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

    Python subprocess模块常见用法分析

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

    Python中文乱码

    Python中文乱码Python中文乱码Python中文乱码Python中文乱码Python中文乱码

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

    执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subprocess这个模块可以非常方便的启动一个子进程,并且控制其输入和输出 Class Popen(args,bufsize = 0,executable=None, stdin =...

    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 subprocess pipe 实时输出日志的操作

    * test11.py ...p = subprocess.Popen(“python test11.py”, shell=True, stdout=subprocess.PIPE) # None表示正在执行中 while p.poll() is None:  out = p.stdout.readline()  if out !

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

    使用py时可能需要连续运行多条shell 命令 1. # coding: UTF-8 import sys reload(sys) sys.setdefaultencoding('utf8') import subprocess import os import commands ...subprocess.call(cmd,shell=True)

    python实现用户登陆邮件通知的方法

    本文实例讲述了python实现用户登陆邮件通知的方法。分享给大家供大家参考。具体如下: ... #!/usr/bin/env python #encoding=utf-8 ...run_comd = subprocess.Popen('w¦grep pts',shell=True,stdout=subprocess.PIP

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

    本文主要给大家介绍了关于使用Python通过subprocess调用adb命令,subprocess包主要功能是执行外部命令(相对Python而言)。和shell类似。 换言之除了adb命令外,利用subprocess可以执行其他的命令,比如ls,cd等等...

    Python subprocess模块功能与常见用法实例详解

    本文实例讲述了Python subprocess模块功能与常见用法。分享给大家供大家参考,具体如下: 一、简介 subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。...

    python subprocess模块.docx

    在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。 subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用...

    Python 运行 shell 获取输出结果的实例

    首先使用内置模块os. &gt;&gt;&gt; import os &gt;&gt;&gt; code = os.system&#40;"pwd && sleep 2"&#41;...&gt;&gt;&gt; subprocess.Popen("pwd && sleep 2", shell=True, cwd="/home") # &lt;subprocess&gt; # /home &gt;&gt;&gt; sub = subproces

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

    资源来自pypi官网。 资源全名:python-subprocess-utils-0.0.1.tar.gz

Global site tag (gtag.js) - Google Analytics