18款禁用网站app破解版,智加设计,php网站安装说明书,团购网站 方案介绍 subprocess是Python 2.4中新增的一个模块#xff0c;它允许你生成新的进程#xff0c;连接到它们的 input/output/error 管道#xff0c;并获取它们的返回#xff08;状态#xff09;码。 这个模块的目的在于替换几个旧的模块和方法。 那么我们到底该用哪个模块、哪个…介绍 subprocess是Python 2.4中新增的一个模块它允许你生成新的进程连接到它们的 input/output/error 管道并获取它们的返回状态码。 这个模块的目的在于替换几个旧的模块和方法。 那么我们到底该用哪个模块、哪个函数来执行命令与系统及系统进行交互呢下面我们来做个总结 首先应该知道的是Python2.4版本引入了subprocess模块用来替换os.system()、os.popen()、os.spawn*()等函数以及commands模块也就是说如果你使用的是Python 2.4及以上的版本就应该使用subprocess模块了。如果你的应用使用的Python 2.4以上但是是Python 3.5以下的版本Python官方给出的建议是使用subprocess.call()函数。Python 2.5中新增了一个subprocess.check_call()函数Python 2.7中新增了一个subprocess.check_output()函数这两个函数也可以按照需求进行使用。如果你的应用使用的是Python 3.5及以上的版本目前应该还很少Python官方给出的建议是尽量使用subprocess.run()函数。当subprocess.call()、subprocess.check_call()、subprocess.check_output()和subprocess.run()这些高级函数无法满足需求时我们可以使用subprocess.Popen类来实现我们需要的复杂功能。 subprocess模块中的常用函数
函数
函数描述subprocess.run()Python 3.5中新增的函数。执行指定的命令等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例。subprocess.call()执行指定的命令返回命令执行状态其功能类似于os.system(cmd)。subprocess.check_call()Python 2.5中新增的函数。 执行指定的命令如果执行成功则返回状态码否则抛出异常。其功能等价于subprocess.run(..., checkTrue)。subprocess.check_output()Python 2.7中新增的的函数。执行指定的命令如果执行状态码为0则返回命令执行结果否则抛出异常。subprocess.getoutput(cmd)接收字符串格式的命令执行命令并返回执行结果其功能类似于os.popen(cmd).read()和commands.getoutput(cmd)。subprocess.getstatusoutput(cmd)执行cmd命令返回一个元组(命令执行状态, 命令执行结果输出)其功能类似于commands.getstatusoutput()。 说明 在Python 3.5之后的版本中官方文档中提倡通过subprocess.run()函数替代其他函数来使用subproccess模块的功能在Python 3.5之前的版本中我们可以通过subprocess.call()subprocess.getoutput()等上面列出的其他函数来使用subprocess模块的功能subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数因此如果我们需要更复杂功能时可以通过subprocess.Popen来完成。subprocess.getoutput()和subprocess.getstatusoutput()函数是来自Python 2.x的commands模块的两个遗留函数。它们隐式的调用系统shell并且不保证其他函数所具有的安全性和异常处理的一致性。另外它们从Python 3.3.4开始才支持Windows平台。 参数解释
subprocess.run(args, *, stdinNone, inputNone, stdoutNone, stderrNone, shellFalse, timeoutNone, checkFalse, universal_newlinesFalse)subprocess.call(args, *, stdinNone, stdoutNone, stderrNone, shellFalse, timeoutNone)subprocess.check_call(args, *, stdinNone, stdoutNone, stderrNone, shellFalse, timeoutNone)subprocess.check_output(args, *, stdinNone, stderrNone, shellFalse, universal_newlinesFalse, timeoutNone)subprocess.getstatusoutput(cmd)subprocess.getoutput(cmd) args 要执行的shell命令默认应该是一个字符串序列如[df, -Th]或(df, -Th)也可以是一个字符串如df -Th但是此时需要把shell参数的值置为True。shell 如果shell为True那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性如管道、文件名通配符、环境变量扩展功能这将是非常有用的。当然python本身也提供了许多类似shell的特性的实现如glob、fnmatch、os.walk()、os.path.expandvars()、os.expanduser()和shutil等。check 如果check参数的值是True且执行命令的进程以非0状态码退出则会抛出一个CalledProcessError的异常且该异常对象会包含 参数、退出状态码、以及stdout和stderr(如果它们有被捕获的话)。stdin ,stdout, stderr(输入 输出 错误句柄) 该参数是传递给Popen.communicate()通常该参数的值必须是一个字节序列如果universal_newlinesTrue则其值应该是一个字符串。 run()函数默认不会捕获命令执行结果的正常输出和错误输出如果我们向获取这些内容需要传递subprocess.PIPE然后可以通过返回的CompletedProcess类实例的stdout和stderr属性或捕获相应的内容call()和check_call()函数返回的是命令执行的状态码而不是CompletedProcess类实例所以对于它们而言stdout和stderr不适合赋值为subprocess.PIPEcheck_output()函数默认就会返回命令执行结果所以不用设置stdout的值如果我们希望在结果中捕获错误信息可以执行stderrsubprocess.STDOUT。universal_newlines 该参数影响的是输入与输出的数据格式比如它的值默认为False此时stdout和stderr的输出是字节序列当该参数的值设置为True时stdout和stderr的输出是字符串。 subprocess.CompletedProcess类 需要说明的是subprocess.run()函数是Python3.5中新增的一个高级函数其返回值是一个subprocess.CompletedPorcess类的实例因此subprocess.completedPorcess类也是Python 3.5中才存在的。它表示的是一个已结束进程的状态信息它所包含的属性如下 args 用于加载该进程的参数这可能是一个列表或一个字符串returncode 子进程的退出状态码。通常情况下退出状态码为0则表示进程成功运行了一个负值-N表示这个子进程被信号N终止了stdout 从子进程捕获的stdout。这通常是一个字节序列如果run()函数被调用时指定universal_newlinesTrue则该属性值是一个字符串。如果run()函数被调用时指定stderrsubprocess.STDOUT那么stdout和stderr将会被整合到这一个属性中且stderr将会为Nonestderr 从子进程捕获的stderr。它的值与stdout一样是一个字节序列或一个字符串。如果stderr灭有被捕获的话它的值就为Nonecheck_returncode() 如果returncode是一个非0值则该方法会抛出一个CalledProcessError异常。 DEVNULL STDOUT PIPE
介绍 在使用 Python 的 subprocess 模块执行外部命令时可以通过不同的参数设置来控制标准输入、标准输出和标准错误之间的流动关系。 subprocess.DEVNULL这是一个特殊的文件描述符将其用作参数时表示将相应的流重定向到操作系统的空设备/dev/null。例如stdinsubprocess.DEVNULL 表示将标准输入重定向到空设备即忽略输入stdoutsubprocess.DEVNULL 表示将标准输出丢弃不进行任何输出stderrsubprocess.DEVNULL 表示将标准错误丢弃不进行任何错误输出。 subprocess.STDOUT这个参数表示将标准错误合并到标准输出中。通过 stderrsubprocess.STDOUT可以将标准错误的消息与标准输出一起处理而不必单独处理标准错误。 subprocess.PIPE这个参数表示将相应的流通过管道传递并可以在程序中进行读取或写入。例如stdoutsubprocess.PIPE 表示将标准输出通过管道传递并允许在 Python 程序中读取这个管道的内容。 案例 在第一个示例中我们将标准输入、标准输出和标准错误都重定向到了空设备。这意味着在执行 echo 命令时不会有任何输入、输出和错误消息输出。 在第二个示例中我们将标准输入通过管道传递给 echo 命令并捕获了标准输出和标准错误的内容。我们使用 PIPE 参数将它们传递给 Python 程序并使用 decode() 方法将字节流转换为字符串以便进行打印和处理。 在第三个示例中我们将标准输入通过管道传递给 ls 命令。由于这个路径不存在ls 命令会产生一个错误消息并将其写入标准错误中。 但是由于我们使用了 stderrsubprocess.STDOUT 参数所以这个错误消息被合并到了标准输出中。在 Python 程序中可以捕获到整个输出流并进行相应的处理和解析。 import subprocess# 将标准输入重定向到空设备将标准输出和标准错误都重定向到空设备
subprocess.run(echo hello /dev/null 21, shellTrue, stdinsubprocess.DEVNULL, stdoutsubprocess.DEVNULL, stderrsubprocess.DEVNULL)# 将标准输入重定向到空设备将标准输出和标准错误均通过管道传递并在 Python 程序中读取它们
result subprocess.run(echo hello, shellTrue, stdinsubprocess.DEVNULL, stdoutsubprocess.PIPE, stderrsubprocess.PIPE)
stdout result.stdout.decode(utf-8)
stderr result.stderr.decode(utf-8)
print(fstdout: {stdout})
print(fstderr: {stderr})# 将标准输入通过管道传递将标准输出与标准错误合并为一个流并在 Python 程序中读取它们
result subprocess.run(ls /not/exist, shellTrue, stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT)
output result.stdout.decode(utf-8)
print(foutput: {output})stderrsubprocess.STDOUT 在使用 Python 的 subprocess 模块执行外部命令时stderrsubprocess.STDOUT 是一种常见的参数设置。它表示将标准错误stderr与标准输出stdout合并为一个流并通过标准输出返回。 通常外部命令会将正常的输出信息写入标准输出stdout而将错误消息写入标准错误stderr。当使用 stderrsubprocess.STDOUT 时标准错误的内容也会被重定向到标准输出中。 这个参数设置通常用于捕获命令执行的输出结果包括标准输出和标准错误。通过将它们合并为一个流可以方便地一起处理或记录。例如你可以将输出保存到变量中或将其写入日志文件进行后续分析。 案例 在上述例子中subprocess.run() 函数执行了一个名为 some_command 的外部命令并通过 stdoutsubprocess.PIPE 参数捕获标准输出。 而 stderrsubprocess.STDOUT 参数将标准错误合并到标准输出中。最终命令的输出结果被存储在 output 变量中并打印出来。 这样就能够获取到命令执行的所有输出包括正常的输出和错误信息并进行相应的处理。 import subprocesscommand some_command
result subprocess.run(command, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, textTrue)
output result.stdoutprint(output)stdoutsubprocess.DEVNULL (在 Windows 系统中需要使用 subprocess.PIPE 代替) subprocess 模块是用来创建新进程与之交互的标准输入、输出和错误流并获取返回状态码的工具。 在使用 subprocess 模块时可以使用 stdoutsubprocess.DEVNULL 参数将子进程的标准输出重定向到 /dev/null即丢弃输出。 具体来说当 stdoutsubprocess.DEVNULL 时子进程的标准输出将被重定向到空设备文件 /dev/null从而实现了丢弃输出的功能。这在不需要获取子进程标准输出结果或者输出都被写入文件中时十分常见。 另外类似的选项还有 stdinsubprocess.PIPE 和 stderrsubprocess.PIPE分别表示将子进程的标准输入和标准错误重定向到管道中以便进行进一步的处理。 案例 上述代码中subprocess.run([ls, -l], stdoutsubprocess.DEVNULL) 将调用 ls -l 命令并将其标准输出重定向到 /dev/null因此不会输出任何信息。 需要注意的是subprocess.DEVNULL 只能在 Linux 或类 Unix 系统中使用而在 Windows 系统中需要使用 subprocess.PIPE 代替。 import subprocess# 调用外部命令 ls并将标准输出重定向到 /dev/null
subprocess.run([ls, -l], stdoutsubprocess.DEVNULL)stdoutsubprocess.PIPE subprocess.PIPE 是 subprocess 模块的一个常量用于指定将子进程的标准输入、输出或错误连接到管道pipe中。 当你在调用 subprocess.run() 或其他与子进程交互的函数时可以使用 subprocess.PIPE 参数来指定将子进程的输入、输出或错误重定向到管道中以便进行进一步的处理。 案例 在上述例子中subprocess.run() 函数执行了一个名为 some_command 的外部命令并通过 stdoutsubprocess.PIPE 参数捕获标准输出。 而 stderrsubprocess.STDOUT 参数将标准错误合并到标准输出中。最终命令的输出结果被存储在 output 变量中并打印出来。 这样就能够获取到命令执行的所有输出包括正常的输出和错误信息并进行相应的处理。 import subprocesscommand some_command
result subprocess.run(command, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, textTrue)
output result.stdoutprint(output)实例
subprocess.run() subprocess.run([ls, -l]) # doesnt capture output
CompletedProcess(args[ls, -l], returncode0) subprocess.run(exit 1, shellTrue, checkTrue)
Traceback (most recent call last):...
subprocess.CalledProcessError: Command exit 1 returned non-zero exit status 1 subprocess.run([ls, -l, /dev/null], stdoutsubprocess.PIPE)
CompletedProcess(args[ls, -l, /dev/null], returncode0,
stdoutbcrw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n)
subprocess.call() subprocess.call([ls, -l])
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面
0subprocess.call(ls -l, shellTrue)
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面
0subprocess.call([ls, -l], stdoutsubprocess.DEVNULL)
0subprocess.call([ls, -l, /test])
ls: 无法访问/test: 没有那个文件或目录
2
suprocess.check_call() subprocess.check_call([ls, -l])
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面
0subprocess.check_call(ls -l, shellTrue)
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面
0subprocess.check_call(ls -l /test, shellTrue)
ls: 无法访问/test: 没有那个文件或目录
Traceback (most recent call last):File stdin, line 1, in moduleFile /usr/lib/python3.4/subprocess.py, line 557, in check_callraise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command ls -l /test returned non-zero exit status 2
sbuprocess.check_output() ret subprocess.check_output([ls, -l])print(ret)
b \xe5\x85\xac\xe5\x85\xb1\xe7\x9a\x84\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe6\xa8\xa1\xe6\x9d\xbf\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe8\xa7\x86\xe9\xa2\x91\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe5\x9b\xbe\xe7\x89\x87\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe6\x96\x87\xe6\xa1\xa3\ndrwxr-xr-x 2 wader wader 4096 4\xe6\x9c\x88 13 2016 \xe4\xb8\x8b\xe8\xbd\xbd\ndrwxr-xr-x 2 wader wader 4096 12\xe6\x9c\x88 7 2015 \xe9\x9f\xb3\xe4\xb9\x90\ndrwxr-xr-x 7 wader wader 4096 5\xe6\x9c\x88 26 2016 \xe6\xa1\x8c\xe9\x9d\xa2\nret subprocess.check_output([ls, -l], universal_newlinesTrue)print(ret)
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面
subprocess.getoutput()与subprocess.getstatusoutput() ret subprocess.getoutput(ls -l)print(ret)
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面retcode, output subprocess.getstatusoutput(ls -l)print(retcode)
0print(output)
总用量 160
drwxr-xr-x 2 wader wader 4096 12月 7 2015 公共的
drwxr-xr-x 2 wader wader 4096 12月 7 2015 模板
drwxr-xr-x 2 wader wader 4096 12月 7 2015 视频
drwxr-xr-x 2 wader wader 4096 12月 7 2015 图片
drwxr-xr-x 2 wader wader 4096 12月 7 2015 文档
drwxr-xr-x 2 wader wader 4096 4月 13 2016 下载
drwxr-xr-x 2 wader wader 4096 12月 7 2015 音乐
drwxr-xr-x 7 wader wader 4096 5月 26 2016 桌面retcode, output subprocess.getstatusoutput(ls -l /test)print(retcode)
2print(output)
ls: 无法访问/test: 没有那个文件或目录
subprocess.Popen
介绍 该类用于在一个新的进程中执行一个子程序。前面我们提到过上面介绍的这些函数都是基于subprocess.Popen类实现的通过使用这些被封装后的高级函数可以很方面的完成一些常见的需求。 由于subprocess模块底层的进程创建和管理是由Popen类来处理的因此当我们无法通过上面哪些高级函数来实现一些不太常见的功能时就可以通过subprocess.Popen类提供的灵活的api来完成。 subprocess.Popen的构造函数
class subprocess.Popen(args, bufsize-1, executableNone, stdinNone, stdoutNone, stderrNone, preexec_fnNone, close_fdsTrue, shellFalse, cwdNone, envNone, universal_newlinesFalse,startup_infoNone, creationflags0, restore_signalsTrue, start_new_sessionFalse, pass_fds()) 参数说明 args 要执行的shell命令可以是字符串也可以是命令各个参数组成的序列。当该参数的值是一个字符串时该命令的解释过程是与平台相关的因此通常建议将args参数作为一个序列传递。bufsize 指定缓存策略0表示不缓冲1表示行缓冲其他大于1的数字表示缓冲区大小负数 表示使用系统默认缓冲策略。stdin, stdout, stderr 分别表示程序标准输入、输出、错误句柄。preexec_fn 用于指定一个将在子进程运行之前被调用的可执行对象只在Unix平台下有效。close_fds 如果该参数的值为True则除了0,1和2之外的所有文件描述符都将会在子进程执行之前被关闭。shell 该参数用于标识是否使用shell作为要执行的程序如果shell值为True则建议将args参数作为一个字符串传递而不要作为一个序列传递。cwd 如果该参数值不是None则该函数将会在执行这个子进程之前改变当前工作目录。env 用于指定子进程的环境变量如果envNone那么子进程的环境变量将从父进程中继承。如果env!None它的值必须是一个映射对象。universal_newlines 如果该参数值为True则该文件对象的stdinstdout和stderr将会作为文本流被打开否则他们将会被作为二进制流被打开。startupinfo和creationflags 这两个参数只在Windows下有效它们将被传递给底层的CreateProcess()函数用于设置子进程的一些属性如主窗口的外观进程优先级等。 subprocess.Popen类的实例可调用的方法
方法描述Popen.poll()用于检查子进程命令是否已经执行结束没结束返回None结束后返回状态码。Popen.wait(timeoutNone)等待子进程结束并返回状态码如果在timeout指定的秒数之后进程还没有结束将会抛出一个TimeoutExpired异常。Popen.communicate(inputNone, timeoutNone)该方法可用来与进程进行交互比如发送数据到stdin从stdout和stderr读取数据直到到达文件末尾。Popen.send_signal(signal)发送指定的信号给这个子进程。Popen.terminate()停止该子进程。Popen.kill()杀死该子进程。
关于communicate()方法的说明 该方法中的可选参数 input 应该是将被发送给子进程的数据或者如没有数据发送给子进程该参数应该是None。input参数的数据类型必须是字节串如果universal_newlines参数值为True则input参数的数据类型必须是字符串。该方法返回一个元组(stdout_data, stderr_data)这些数据将会是字节穿或字符串如果universal_newlines的值为True。如果在timeout指定的秒数后该进程还没有结束将会抛出一个TimeoutExpired异常。捕获这个异常然后重新尝试通信不会丢失任何输出的数据。但是超时之后子进程并没有被杀死为了合理的清除相应的内容一个好的应用应该手动杀死这个子进程来结束通信。需要注意的是这里读取的数据是缓冲在内存中的所以如果数据大小非常大或者是无限的就不应该使用这个方法。 subprocess.Popen使用实例
实例1 import subprocessp subprocess.Popen(df -Th, stdoutsubprocess.PIPE, shellTrue)print(p.stdout.read())
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 12G 26G 31% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 386M 3.5G 10% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs tmpfs 783M 0 783M 0% /run/user/0
tmpfs tmpfs 783M 0 783M 0% /run/user/1000
实例2 obj subprocess.Popen([python], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE)obj.stdin.write(print(1) \n)obj.stdin.write(print(2) \n)obj.stdin.write(print(3) \n)out,err obj.communicate()print(out)
1
2
3 print(err)
实例3 obj subprocess.Popen([python], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE)out,err obj.communicate(inputprint(1) \n)print(out)
1 print(err)
实例4
实现类似df -Th | grep data命令的功能实际上就是实现shell中管道的共功能。 p1 subprocess.Popen([df, -Th], stdoutsubprocess.PIPE)p2 subprocess.Popen([grep, data], stdinp1.stdout, stdoutsubprocess.PIPE)out,err p2.communicate()print(out)
/dev/vdb1 ext4 493G 4.8G 463G 2% /data
/dev/vdd1 ext4 1008G 420G 537G 44% /data1
/dev/vde1 ext4 985G 503G 432G 54% /data2 print(err)
None