返回顶部
首页 > 资讯 > 后端开发 > Python >Python异步在非阻塞子进程中运行命令的方法是什么
  • 102
分享到

Python异步在非阻塞子进程中运行命令的方法是什么

2023-07-05 14:07:48 102人浏览 薄情痞子

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

摘要

今天小编给大家分享一下python异步在非阻塞子进程中运行命令的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.

今天小编给大家分享一下python异步在非阻塞子进程中运行命令的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1. 什么是 asyncio.subprocess.Process

我们可以从 asyncio 执行命令。该命令将在我们可以使用非阻塞 I/O 写入和读取的子进程中运行。

asyncio.subprocess.Process 类提供了由 asyncio 运行的子进程的表示。它在 asyncio 程序中提供子进程的句柄,允许对其执行操作,例如等待和终止它。

api 与 multiprocessing.Process 类非常相似,可能与 subprocess.Popen 类更相似。具体来说,它与 subprocess.Popen 共享 wait()、communicate() 和 send_signal() 等方法以及 stdin、stdout 和 stderr 等属性。

现在我们知道了 asyncio.subprocess.Process 类是什么,让我们看看如何在我们的 asyncio 程序中使用它。

我们不直接创建 asyncio.subprocess.Process。相反,在 asyncio 程序中执行子进程时,会为我们创建一个类的实例。

有两种方法可以将外部程序作为子流程执行并获取 Process 实例,它们是:

  • asyncio.create_subprocess_exec() 用于直接运行命令。

  • asyncio.create_subprocess_shell() 用于通过 shell 运行命令。

让我们依次看一下每个示例。

2. 如何直接运行命令

命令是在命令行(终端或命令提示符)上执行的程序。这是另一个直接运行的程序。

linuxMacOS 上的常见示例可能是:

  • ‘ls’ 列出目录的内容

  • ‘cat’报告文件的内容

  • “data”报告日期

  • ‘echo’ 报告一个字符串

  • ‘sleep’ 睡眠几秒钟

我们可以通过 create_subprocess_exec() 函数从 asyncio 程序执行命令。

asyncio.create_subprocess_exec() 函数接受一个命令并直接执行它。

这很有用,因为它允许命令在子进程中执行,并允许 asyncio 协程读取、写入和等待它。

与 asyncio.create_subprocess_shell() 函数不同,asyncio.create_subprocess_exec() 不会使用 shell 执行命令。

这意味着 shell 提供的功能,例如 shell 变量、脚本和通配符,在执行命令时不可用。

这也意味着执行命令可能更安全,因为没有机会进行 shell 注入。

现在我们知道了 asyncio.create_subprocess_exec() 的作用,让我们看看如何使用它。

2.1. 如何使用 Asyncio create_subprocess_exec()

asyncio.create_subprocess_exec() 函数将在子进程中执行给定的字符串命令。

它返回一个代表子进程的 asyncio.subprocess.Process 对象。

create_subprocess_exec() 函数是一个协程,这意味着我们必须等待它。它会在子流程启动后返回,而不是在子流程完成时返回。

...# execute a command in a subprocessprocess = await asyncio.create_subprocess_exec('ls')

正在执行的命令的参数必须作为后续参数提供给 create_subprocess_exec() 函数。

...# execute a command with arguments in a subprocessprocess = await asyncio.create_subprocess_exec('ls', '-l')

我们可以通过等待 wait() 方法来等待子进程完成。

...# wait for the subprocess to terminateawait process.wait()

我们可以通过调用 terminate() 或 kill() 方法直接停止子进程,这将在子进程中引发一个信号。

...# terminate the subprocessprocess.terminate()

命令的输入和输出将由 stdin、stderr 和 stdout 处理。我们可以让 asyncio 程序处理子进程的输入或输出。

这可以通过指定输入或输出流并指定要重定向的常量来实现,例如 asyncio.subprocess.PIPE。

例如,我们可以将命令的输出重定向到 asyncio 程序:

...# start a subprocess and redirect outputprocess = await asyncio.create_subprocess_exec('ls', stdout=asyncio.subprocess.PIPE)

然后我们可以通过 asyncio.subprocess.Process 实例通过 communicate() 方法读取程序的输出。

此方法是协程,必须等待。它用于通过子流程发送和接收数据。

...# read data from the subprocessline = process.communicate()

我们还可以通过以字节为单位设置“input”参数,通过 communicate() 方法将数据发送到子进程。

...# start a subprocess and redirect inputprocess = await asyncio.create_subprocess_exec('ls', stdin=asyncio.subprocess.PIPE)# send data to the subprocessprocess.communicate(input=b'Hello\n')

在后台,asyncio.subprocess.PIPE 将子进程配置为指向 StreamReader 或 StreamWriter,用于向子进程发送数据或从子进程发送数据,并且 communicate() 方法将从配置的读取器读取或写入字节。

我们可以通过子进程通过 stdin、stdout 和 stderr 属性直接与 StreamReader 或 StreamWriter 交互。

...# read a line from the subprocess output streamline = await process.stdout.readline()

现在我们知道如何使用 create_subprocess_exec() 函数,让我们看一些工作示例。

2.2. Asyncio create_subprocess_exec() 示例

我们可以探索如何在 asyncio 的子进程中运行命令。在这个例子中,我们将执行“echo”命令来报告一个字符串。

echo 命令将直接在标准输出上报告提供的字符串。下面列出了完整的示例。

请注意,此示例假设您可以访问“echo”命令,我不确定它是否适用于 windows

# SuperFastPython.com# example of executing a command as a subprocess with asyncioimport asyncio # main coroutineasync def main():    # start executing a command in a subprocess    process = await asyncio.create_subprocess_exec('echo', 'Hello World')    # report the details of the subprocess    print(f'subprocess: {process}') # entry pointasyncio.run(main())

运行示例首先创建 main() 协程并将其作为 asyncio 程序的入口点执行。

main() 协程运行并调用 create_subprocess_exec() 函数来执行命令。

main() 协程在创建子进程时挂起。返回一个 Process 实例。

main() 协程恢复并报告子进程的详细信息。 main() 进程终止,asyncio 程序终止。

echo 命令的输出在命令行上报告。这突出了我们如何从 asyncio 程序执行命令。

Hello Worldsubprocess: <Process 50249>

3. 如何通过 Shell 运行命令

我们可以使用 shell 执行命令。shell 是命令行的用户界面,称为命令行解释器 (CLI)。它将代表用户解释和执行命令。

它还提供诸如用于脚本、通配符、管道、shell 变量(例如 PATH)等的原始编程语言等功能。

例如,我们可以将一条命令的输出重定向为另一条命令的输入,比如将“/etc/services”文件的内容重定向到Word count命令“wc”中,统计行数:

cat /etc/services | wc -l

基于 Unix 的操作系统中的 shell 示例包括:

Python异步在非阻塞子进程中运行命令的方法是什么

shell 已经在运行,它被用来启动 Python 程序。您无需执行任何特殊操作即可获取或访问 shell。

我们可以通过 create_subprocess_shell() 函数从 asyncio 程序执行命令。

asyncio.create_subprocess_shell() 函数接受一个命令并使用当前用户 shell 执行它。

这很有用,因为它不仅允许执行命令,还允许使用 shell 的功能,例如重定向、通配符等。

该命令将在执行 asyncio 程序的进程的子进程中执行。重要的是,asyncio 程序能够与子进程异步交互,例如通过协程。

通过 shell 而不是直接执行命令时,可能会有安全考虑。

这是因为请求执行命令和正在执行的命令之间至少存在一层间接和解释,允许可能的恶意注入。

现在我们知道了 asyncio.create_subprocess_shell() 的作用,让我们看看如何使用它。

3.1. 如何使用 Asyncio create_subprocess_shell()

asyncio.create_subprocess_shell() 函数将通过当前 shell 执行给定的字符串命令。

它返回一个表示进程的 asyncio.subprocess.Process 对象。

它与我们在上一节中看到的 create_subprocess_shell() 函数非常相似。不过,我们将回顾如何使用该函数以及如何通过 Process 实例与流程交互(以防您直接跳到本节)。

create_subprocess_shell() 函数是一个协程,这意味着我们必须等待它。它会在子流程启动后返回,而不是在子流程完成时返回。

...# start a subprocessprocess = await asyncio.create_subprocess_shell('ls')

我们可以通过等待 wait() 方法来等待子进程完成。

...# wait for the subprocess to terminateawait process.wait()

我们可以通过调用 terminate() 或 kill() 方法直接停止子进程,这将在子进程中引发一个信号。

命令的输入和输出将由 shell 处理,例如标准输入、标准错误和标准输出。

我们可以让 asyncio 程序处理子进程的输入或输出。

这可以通过指定输入或输出流并指定要重定向的常量来实现,例如 asyncio.subprocess.PIPE。

例如,我们可以将命令的输出重定向到 asyncio 程序:

...# start a subprocess and redirect outputprocess = await asyncio.create_subprocess_shell('ls', stdout=asyncio.subprocess.PIPE)

然后我们可以通过 asyncio.subprocess.Process 实例通过 communicate() 方法读取程序的输出。

此方法是协程,必须等待。它用于通过子流程发送和接收数据。

...# read data from the subprocessline = process.communicate()

我们还可以通过以字节为单位设置“input”参数,通过 communicate() 方法将数据发送到子进程。

...# start a subprocess and redirect inputprocess = await asyncio.create_subprocess_shell('ls', stdin=asyncio.subprocess.PIPE)# send data to the subprocessprocess.communicate(input=b'Hello\n')

在后台,asyncio.subprocess.PIPE 将子进程配置为指向 StreamReader 或 StreamWriter,用于向子进程发送数据或从子进程发送数据,并且 communicate() 方法将从配置的读取器读取或写入字节。

我们可以通过子进程通过 stdin、stdout 和 stderr 属性直接与 StreamReader 或 StreamWriter 交互。

...# read a line from the subprocess output streamline = await process.stdout.readline()

现在我们知道如何使用 create_subprocess_shell() 函数,让我们看一些工作示例。

3.2. Asyncio create_subprocess_shell() 示例

我们可以探索如何使用 shell 在 asyncio 的子进程中运行命令。在这个例子中,我们将执行“echo”命令来报告一个字符串。

echo 命令将直接在标准输出上报告提供的字符串。下面列出了完整的示例。

请注意,此示例假设您可以访问“echo”命令,我不确定它是否适用于 Windows。

# SuperFastPython.com# example of executing a shell command as a subprocess with asyncioimport asyncio # main coroutineasync def main():    # start executing a shell command in a subprocess    process = await asyncio.create_subprocess_shell('echo Hello World')    # report the details of the subprocess    print(f'subprocess: {process}') # entry pointasyncio.run(main())

运行示例首先创建 main() 协程并将其作为 asyncio 程序的入口点执行。main() 协程运行并调用 create_subprocess_shell() 函数来执行命令。

main() 协程运行并调用 create_subprocess_shell() 函数来执行命令。main() 协程恢复并报告子进程的详细信息。 main() 进程终止,asyncio 程序终止。

echo 命令的输出在命令行上报告。这突出显示了我们如何使用 shell 从 asyncio 程序执行命令。

subprocess: <Process 43916>Hello World

以上就是“Python异步在非阻塞子进程中运行命令的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网Python频道。

--结束END--

本文标题: Python异步在非阻塞子进程中运行命令的方法是什么

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

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

猜你喜欢
  • Python异步在非阻塞子进程中运行命令的方法是什么
    今天小编给大家分享一下Python异步在非阻塞子进程中运行命令的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1....
    99+
    2023-07-05
  • Python异步在非阻塞子进程中运行命令详解
    目录1. 什么是 asyncio.subprocess.Process2. 如何直接运行命令2.1. 如何使用 Asyncio create_subprocess_exec()2.2...
    99+
    2023-03-22
    Python非阻塞命令运行 Python 异步
  • Python中的同步异步阻塞与非阻塞是什么
    今天小编给大家分享一下Python中的同步异步阻塞与非阻塞是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、状态介绍在...
    99+
    2023-07-05
  • Nodejs中的非阻塞异步IO是什么
    这篇文章主要讲解了“Nodejs中的非阻塞异步IO是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nodejs中的非阻塞异步IO是什么”吧!我们以网络请求IO为例,首先介绍服务端处理一次...
    99+
    2023-07-04
  • Python异步之在Asyncio中怎么运行阻塞任务
    今天小编给大家分享一下Python异步之在Asyncio中怎么运行阻塞任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文...
    99+
    2023-07-05
  • 什么是Javascript引擎和运行时以及单线程与非阻塞和异步以及并发语言分别是怎样的
    这篇文章将为大家详细讲解有关什么是Javascript引擎和运行时以及单线程与非阻塞和异步以及并发语言分别是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了...
    99+
    2024-04-02
  • Linux命令通过SSH在远程运行的方法是什么
    本篇文章为大家展示了Linux命令通过SSH在远程运行的方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们有时可能需要在远程机器上运行一些命令。如果只是偶尔进行的操作,要实现这个目的,可以...
    99+
    2023-06-28
  • java命令行编译运行的方法是什么
    要使用Java命令行进行编译和运行,需要先安装Java Development Kit(JDK)。 编译Java程序的步骤如下: ...
    99+
    2023-10-26
    java
  • Linux中运行python文件的命令是什么
    今天小编给大家分享一下Linux中运行python文件的命令是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、 通过r...
    99+
    2023-06-28
  • 使用SSH远程运行Linux命令具体方法是什么
    使用SSH远程运行Linux命令具体方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来...
    99+
    2023-06-28
  • Python中的异步编程算法是什么?
    Python中的异步编程算法是指一种能够提高程序效率的编程方法,它可以在程序执行某个任务时,同时执行其他任务,从而实现并发执行。在Python中,异步编程通常使用asyncio模块来实现。 异步编程的核心是事件循环,它负责调度任务的执行。在...
    99+
    2023-07-08
    对象 异步编程 编程算法
  • python命令行传入参数的方法是什么
    Python命令行传入参数的方法是使用sys模块中的argv列表。argv是一个包含命令行参数的列表,其中第一个元素是脚本的名称,后...
    99+
    2023-09-22
    python
  • 同步还是异步?Python 如何在 Git 中进行更好的编程体验?
    在 Git 中进行编程时,一个常见的问题是同步和异步的选择。同步和异步是两种不同的编程模式,每种模式都有其优缺点。在本文中,我们将探讨 Python 如何在 Git 中进行更好的编程体验。 同步编程模式 同步编程模式是指代码按照顺序运行。...
    99+
    2023-11-07
    同步 git 异步编程
  • 检查 Go 程序是否在运行的方法:使用 go run 命令
    对于一个Golang开发者来说,牢固扎实的基础是十分重要的,编程网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《检查 Go 程序是否在运行的方法:使用 go run 命令》,主要介绍了,...
    99+
    2024-04-04
  • ubuntu中redis重启命令行的方法是什么
    在Ubuntu中,可以使用以下命令行来重启Redis:1. 使用systemctl命令(适用于Ubuntu 16.04及以上版本):...
    99+
    2023-09-05
    redis ubuntu
  • ubuntu中运行c程序的方法是什么
    在Ubuntu中运行C程序的方法可以通过以下步骤实现: 打开终端。 使用文本编辑器编写C程序,比如使用nano或者vim。 编写完...
    99+
    2024-04-08
    ubuntu
  • linux命令行中释放资源的方法是什么
    在Linux命令行中,释放资源的方法可以通过以下几种方式实现:1. 使用`kill`命令:可以通过向进程发送不同的信号来释放资源。常...
    99+
    2023-09-25
    linux
  • Go语言中数组在异步编程中的优化方法是什么?
    Go语言作为一门强大的编程语言,越来越受到开发者们的青睐。在异步编程中,数组的使用是非常常见的,但是如何对数组进行优化呢?本文将会介绍在Go语言中数组在异步编程中的优化方法。 一、为什么需要优化数组 在Go语言中,数组是一种非常常见的数据类...
    99+
    2023-08-08
    异步编程 数据类型 数组
  • Linux系统杀死进程命令的具体方法是什么
    这篇文章的内容主要围绕Linux系统杀死进程命令的具体方法是什么进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!Linux系统中如何结束某个进程?1 ...
    99+
    2023-06-28
  • 在Linux下让进程在后台可靠运行的几种方法分别是什么
    这期内容当中小编将会给大家带来有关在Linux下让进程在后台可靠运行的几种方法分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Linux系统中有时我们会遇到用 telnet/ssh 登录了远程的...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作