返回顶部
首页 > 资讯 > 后端开发 > Python >Python中使用subprocess库创建附加进程
  • 748
分享到

Python中使用subprocess库创建附加进程

Python附加进程Pythonsubprocess库附加进程Pythonsubprocess库 2022-06-03 13:06:39 748人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

前言 subprocess库提供了一个api创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。 本篇,将详细介绍python创建附加进行的库:

前言

subprocess库提供了一个api创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。

本篇,将详细介绍python创建附加进行的库:subprocess。

run(运行外部命令)

subprocess库本身可以替换os.system(),os.spawnv()等函数。现在我们来通过subprocess库运行一个外部命令,但不采用os.system()。示例如下:


import subprocess

completed = subprocess.run('whoami')
print(completed.returncode)

这里我们运行了一个windows系统常用的whoami命令,返回当前用户的名称,输出如下:

subprocess.run

这里,我们使用了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返回消息

本例会通过一个子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会在内部管理数据读取。运行之后,效果如下:

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())

sys的命令交互

在我们学习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()

运行之后,效果如下:

os

到此这篇关于Python中使用subprocess库创建附加进程的文章就介绍到这了,更多相关Python附加进程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python中使用subprocess库创建附加进程

本文链接: https://lsjlt.com/news/11257.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中使用subprocess库创建附加进程
    前言 subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。 本篇,将详细介绍Python创建附加进行的库:...
    99+
    2022-06-03
    Python附加进程 Python subprocess库附加进程 Python subprocess库
  • Python中的多进程怎么创建
    这篇“Python中的多进程怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中的多进程怎么创建”文章吧。1...
    99+
    2023-07-02
  • Python进阶教程之创建本地PyPI仓库
    目录初识pypi仓库创建本地 PyPI 仓库安装 pypiserver上传 Python 安装包使用私有 PyPI 仓库总结初识pypi仓库 pypi仓库 是对第三方库的代码仓管库...
    99+
    2024-04-02
  • 怎么在python中使用threading创建线程
    本篇文章为大家展示了怎么在python中使用threading创建线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究...
    99+
    2023-06-14
  • Python多进程库multiprocessing中进程池Pool类的使用详解
    问题起因 最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果。没错!类似baggi...
    99+
    2022-06-04
    进程 详解 Python
  • Web应用程序如何使用C#进行创建
    本篇文章为大家展示了Web应用程序如何使用C#进行创建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用微软正在推行的.NET技术和C#语言可以快速建立Web应用程序,其安全性和可升级性都大大胜过普...
    99+
    2023-05-31
    c# web应用程序
  • python编程使用PyQt创建UE蓝图
    目录实现思路1、场地部署2、节点创建3、连线①首先是连线类的创建②如何连接节点实现思路 1、场地部署:我们需要拥有一个可以用来画节点的地方!详看我这篇文章QGraphicsScene...
    99+
    2024-04-02
  • MySQL中怎么使用Webmin创建数据库
    MySQL中怎么使用Webmin创建数据库,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  MySQL+Webmin怎么创建数据库  新的...
    99+
    2024-04-02
  • Python中集合创建与使用详解
    目录一、集合二、如何创建集合?三、如何访问集合中的值?四、不可变集合五、如何确定一个集合里有多少个元素?六、python 集合类型的所有内置方法总结表,仅供参考。总结一、集合 在 ...
    99+
    2024-04-02
  • 使用python怎么创建一个GUI程序
    本篇文章为大家展示了使用python怎么创建一个GUI程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-14
  • Python线程池thread pool怎么创建使用
    本文小编为大家详细介绍“Python线程池thread pool怎么创建使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python线程池thread pool怎么创建使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-06-30
  • 怎么使用python编程创建文件夹
    在Python中,可以使用内置的os模块来创建文件夹。以下是一个简单的示例代码: import os # 指定要创建的文件夹路径 ...
    99+
    2024-04-02
  • Linux中怎么使用nmcli来创建/添加网桥
    今天小编给大家分享一下Linux中怎么使用nmcli来创建/添加网桥的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。如何使用 ...
    99+
    2023-06-28
  • NAS中如何创建和使用加密文件夹
    今天就跟大家聊聊有关NAS中如何创建和使用加密文件夹,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前往TOS桌面>控制面板>权限>共享文件夹; 点击创建,...
    99+
    2023-06-04
  • PostgreSQL中如何使用create database创建数据库
    这篇文章将为大家详细讲解有关PostgreSQL中如何使用create database创建数据库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、create database语法格式CREATE&nb...
    99+
    2023-06-14
  • 简要讲解Python编程中线程的创建与锁的使用
    创建线程 创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, targe...
    99+
    2022-06-04
    线程 简要 Python
  • 怎么使用远程DSN创建数据库连接
    这篇文章主要介绍了怎么使用远程DSN创建数据库连接,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。您可以使用在远程计算机上定义的DSN 在Dr...
    99+
    2024-04-02
  • 如何创建使用VB.NET线程访问数据库
    这篇文章将为大家详细讲解有关如何创建使用VB.NET线程访问数据库,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。创建VB.NET线程访问数据库数据库应用中,特别是网络数据库访问,因为可能要访问的数据量较大...
    99+
    2023-06-17
  • C++ 函数库如何创建和使用多线程?
    答案:在 c++++ 中,可以使用 std::thread 函数库创建和使用多线程以实现并发编程。详细描述:使用 std::thread 创建新线程,并在子线程中执行指定代码。使用同步机...
    99+
    2024-04-18
    c++ 多线程 同步机制
  • Android Studio 使用SQLite数据库来创建数据库+创建数据库表+更新表再次往表添加字段
    目录 一.前言 二.SQLite数据库介绍 1.什么是SQLite数据库 2.特点 3.SQLite 操作API 4.SQLite数据类型 三.SQlite数据库的使用 1.创建类继承SQLiteOPenHelper 2.创建数据库 3.创...
    99+
    2023-09-25
    数据库 sqlite android android studio ide java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作