Python subprocess库建附加进程的方法操作是什�
Admin 2022-06-13 群英技术资� 99 次浏�
subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据�
本篇,将详细介绍Python创建附加进行的库:subprocess�
subprocess库本身可以替换os.system(),os.spawnv()等函数。现在我们来通过subprocess库运行一个外部命令,但不采用os.system()。示例如下:
import subprocess completed = subprocess.run('whoami') print(completed.returncode)
这里我们运行了一个windows系统常用的whoami命令,返回当前用户的名称,输出如下:
这里,我们使用了subprocess.run调用了子进程运行windows命令。它返回一个CompletedProcess实例,它包含了与进行有关的信息。returncode为子进程的退出状态码。通常情况下,退出状态码�0则表示进程成功运行了;一个负�-N表示这个子进程被信号N终止了�
该函数还有许多参数,比如shell,默认值为False表示直接运行命令,如果主动赋值为True则会创建一个中间shell进程,由这个进程运行命令�
import subprocess completed = subprocess.run('echo 123',shell=True) print(completed.returncode)
比如这里,我们打�123�
该库还有一个call()函数,subprocess.run有一个check参数,如果没有设置该参数,等价于调用了call()函数。check默认值为False�
对于run()函数启动的进程,它的标准输入输出通道会绑定到父进程的输入输出。这说明调用程序无法捕获命令的输出。不过,我们可以通过为stdout和stderr参数传入PIPE来捕获输出,以备以后处理�
import subprocess completed = subprocess.run('whoami',stdout=subprocess.PIPE) print(completed.returncode) print(len(completed.stdout)) print(completed.stdout.decode('UTF-8'))
运行之后,效果如下:
如果设置run()函数的参数check=True与stdout为PIPE,等价于调用了check_output()函数�
本例会通过一个子shell运行命令,在命令返回错误码并退出之前,将详细输入到控制台。实例如下:
import subprocess try: completed = subprocess.run( 'echoa 123', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) except subprocess.CalledProcessError as err: print("ERROR:", err) else: print("else") print(completed.returncode) print(len(completed.stdout)) print(completed.stdout.decode('UTF-8')) print(len(completed.stderr)) print(completed.stderr.decode('gbk'))
运行之后,效果如下:
这里我们输入了一个错误的命令,可以看到因为命令错误,并没有输出命令的执行结果�0�64中间就是completed.stdout,为空。而命令将错误消息返回了。这是因为我们设置了stdout与stderr为subprocess.PIPE,表明这些通道要开放。这样我们才能获取子shell运行的结果获取所运行的错误提示。(读者可以将命令改正确后可以发现错误消息没有了,正确执行结果会输出。这就是subprocess库创建进程的通信机制�
需要注意的是,如果需要抑制输出效果,可以将stdout与stderr设置为subprocess.DEVNULL。不过改了之后,上面代码肯定会报错,因为管道关闭,通信也就关闭了。也就是没有这些参数了�
subprocess库还有一个非常重要的类Popen,它是用来建立其他API的底层API,对更复杂的进程交互很有用�
比如run(),call(),check_call()和check_output()函数都是Popen类的包装器。直接使用Popen可以更好的控制如何运行命令以及如何处理输入和输出流。Popen的构造函数利用参数建立新进程,使父进程可以通过管道与之通信�
下面,我们来分别介绍进程间通信的方式�
要运行一个进程并读取它的所有输出,可以设置stdout为PIPE并调用communicate()函数。示例如下:
import subprocess prc = subprocess.Popen('whoami', stdout=subprocess.PIPE) stdout_value = prc.communicate()[0].decode('utf-8') print(repr(stdout_value))
如上面代码所示,Popen会在内部管理数据读取。运行之后,效果如下�
如果你需要调用一个管道,并完成写数据的操作,可以设置stdin为PIPE�
import subprocess prc = subprocess.Popen(["cmd", "/c", 'type', '-'], stdin=subprocess.PIPE) prc.communicate('stdin'.encode('UTF-8'))
要完成进程的双向通信,可以直接将stdin与stdout都设置为PIPE即可。示例如下:
import subprocess cmd = "cmd /c type E:/Project/debug.log" cmd.encode('utf-8') prc = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE) msg = 'stdin'.encode('UTF-8') stdout_value = prc.communicate(msg)[0].decode('utf-8') print(repr(stdout_value))
至于如果命令行错误需要捕获错误消息,可以直接将stderr也设置为PIPE�
在Linux系统中,我们可以将多个命令连接成一个管线,即可以把它们的输入输出串联在一起。通过Popen我们也可以完成类似的操作,只需要将一个Popen实例的stdout属性被用左管线中下一个Popen实例的stdin参数即可。至于最后肯定还是要设置为PIPE,毕竟我们还是要获取多个管道段消息结果,示例如下�
import subprocess cmd1 = "cmd /c type E:/Project/debug.log" proc1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE, encoding='utf-8') cmd2 = "tree /F | findstr 拒绝访问" proc2 = subprocess.Popen(cmd1, stdout=subprocess.PIPE, stdin=proc1.stdout, encoding='utf-8') result = proc2.stdout for line in result: print(line.decode('utf-8').strip())
在我们学习Python时,一般使用input()进行用户输入数据。但是其实sys库也可以进行输入输出判断,但它涉及的是进程间的交互,示例如下�
import sys sys.stderr.write('开始\n') sys.stderr.flush() while True: next_line = sys.stdin.readline() sys.stderr.flush() if next_line.strip() == "9599": break sys.stdout.write(next_line) sys.stdout.flush() sys.stderr.write('结束\n') sys.stderr.flush()
运行之后,效果如下:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�
猜你喜欢
在python中,有些需求需要我们去除指定字符,那么如果想要去除头尾的指定字符,有什么办法呢?下面给大家介绍三个函数,strip()、lstrip()、rstrip()�
python实现函数重载有什么方法?在python中,我们想要实现函数重载,可以利用装饰器。接下来就给大家分享一下python实现函数重载的过程及操作,感兴趣的朋友可以参考,对于python实现函数重载,下文有很详细的介绍�
大家好,本篇文章主要讲的是python的广播机制详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
这篇文章主要介绍了python调用kubernetesAPI简单使用方法,K8s也提供API接口,提供这个接口的是管理节点的apiserver组件,下文更多相关内容,需要的小伙伴可以参考一�
这篇文章主要介绍了Python数据分析之绘制m1-m2数据,文章基于python的相关资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一�
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所�
增值电信经营许可证 : B1.B2-20140078