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(默认)一知半解,现在通过穷举各种用例来融会贯通
个人理解:
为什么推荐使用shell = False ? 这时,如何进行环境变量替换?
推荐使用shell = False 是因为windows和linux变量替换规则不同(个人猜测),
如需进行变量替换,可以通过os.environ中的环境变量进行替换;
此外还可以通过 env参数替换环境变量
一直对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
上一篇: 中国科学技术馆