欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python subprocess shell=True False 的异同

程序员文章站 2022-07-04 12:09:27
...
参见:https://*.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 linux