参见:
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基于 ...
res = subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 这样打包后出来的程序就不会出现命令框,而且也能够正常运行了。 以上这篇python隐藏终端执行cmd...
问题产生描述 ... p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p.wait() # 从标准输出读出shell命令的输出结果 #rt = p.stdout.read().decode() #
它的构造函数如下: 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 杀掉全部派生的子进程方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
经试验显示效果不错。 #!/usr/bin/python3 # -*- coding: utf-8 -*- import os import subprocess # 与在命令窗口执行显示效果相同,如有... p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, std
本文实例讲述了Python subprocess模块常见用法。...subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令 示例如下: >>
Python中文乱码Python中文乱码Python中文乱码Python中文乱码Python中文乱码
执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subprocess这个模块可以非常方便的启动一个子进程,并且控制其输入和输出 Class Popen(args,bufsize = 0,executable=None, stdin =...
>>> subprocess.call(exit 1, shell=True) 1 测试调用系统中cmd命令,显示命令执行的结果: x=subprocess.check_output([echo, Hello World!],shell=True) print(x) Hello World! 测试在python中显示文件内容: y=...
* 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 !
使用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实现用户登陆邮件通知的方法。分享给大家供大家参考。具体如下: ... #!/usr/bin/env python #encoding=utf-8 ...run_comd = subprocess.Popen('w¦grep pts',shell=True,stdout=subprocess.PIP
本文主要给大家介绍了关于使用Python通过subprocess调用adb命令,subprocess包主要功能是执行外部命令(相对Python而言)。和shell类似。 换言之除了adb命令外,利用subprocess可以执行其他的命令,比如ls,cd等等...
本文实例讲述了Python subprocess模块功能与常见用法。分享给大家供大家参考,具体如下: 一、简介 subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。...
在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。 subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用...
首先使用内置模块os. >>> import os >>> code = os.system("pwd && sleep 2")...>>> subprocess.Popen("pwd && sleep 2", shell=True, cwd="/home") # <subprocess> # /home >>> sub = subproces
资源来自pypi官网。 资源全名:python-subprocess-utils-0.0.1.tar.gz