首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从subprocess.Popen异步读取stdout

subprocess.Popen异步读取stdout的方法是使用asyncio库和subprocess库。以下是一个简单的示例代码:

代码语言:python
代码运行次数:0
复制
import asyncio
import subprocess

async def read_stdout(process):
    while True:
        line = await process.stdout.readline()
        if not line:
            break
        print(line.decode('utf-8').strip())

async def main():
    process = await asyncio.create_subprocess_shell(
        'ping -c 5 www.google.com',
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )

    await asyncio.wait([
        read_stdout(process),
        process.wait()
    ])

asyncio.run(main())

在这个示例中,我们使用asyncio.create_subprocess_shell创建一个子进程,并使用asyncio.wait等待子进程完成。同时,我们使用read_stdout函数异步读取stdout,并在每次读取到新的一行时打印出来。

注意,在使用asyncio时,我们需要确保所有的异步操作都在asyncio事件循环中运行。在这个示例中,我们使用asyncio.run来启动事件循环,并在其中运行main函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python正向连接后门

然后进入一个循环,每次读取一下socket中数据,然后写入stdin中,通过管道传输给shell,shell执行完后,我用stdout.read()将结果读取到,再send给客户端。     ...python中read不是异步的,只有读取指定字节或读取到EOF才会返回结果。如果没有EOF那么read就一直读,程序阻塞在这里,于是表现出来就是卡死了。我nc中输入dir,什么返回都没有。...所以,解决思路有四: 1.如果能知道shell向管道里写入了多少字节数据,我read(n)读取这个字节数据即可 2.如果有异步的read函数,调用也能解决问题 3.实在没办法,可以另开启一个线程...没办法知道管道内数据的大小,没找到异步read函数。     ...用了多线程,开启了一个新线程,这个线程专门stdout中read数据,即使阻塞也不会影响主线程的socket过程。

1.4K31
  • Python,Shell 和 三个标准文件

    实战 比较一下比较好记忆: ls -a (场景一) import subprocess def run_cmd(cmd): return subprocess.Popen( cmd... stdout 和 stderr 文件中读取数据,直到达到文件结尾。等待进程终止。可选的 input 参数应该是要发送到子进程的字符串,如果没有数据应该发送给子进程,则为 None。...communicate() 返回一个元组 (stdout, stderr)。 例子中我们并没有显式的指定 input 参数,默认为 None,我们只 stdin 和 stderr 文件中读取数据。...这里其实是一个同步的过程,进程终止后才会返回所读取到的数据(进程终止,文件自然也结尾了),也就是 communicate() 方法直接使命令执行变为了同步,不执行完成就一直阻塞。...(),于是 p 是 subprocess.Popen 类的实例 查看 Popen 类源码 738 行: self.stdout = os.fdopen(c2pread, 'rU', bufsize)

    1.4K60

    记录Python 调用 subprocess.Popen 卡死解决办法

    start. pid:%d cmds:%r", p.pid, cmds) while p.poll() is None: data = p.stdout.readline()...接收传入的系统命令,使用 subprocess.Popen 函数创建子进程来执行指定的命令。...设置了一些参数来配置子进程的执行环境,具体包括: stdout=subprocess.PIPE:将子进程的标准输出连接到管道,以便后续读取输出。...stderr=subprocess.STDOUT:将子进程的标准错误输出合并到标准输出中。 universal_newlines=True:将输入和输出转换为文本模式,而不是字节模式。...综上所述,subprocess.run 适合简单地执行外部命令并获取输出;subprocess.Popen 适合更灵活地控制子进程,以及处理更复杂的子进程交互,注意不要使用 stdout=subprocess.PIPE

    1.4K10

    Python模块之subprocess

    执行结果上看,子进程 ping命令并未执行完毕,subprocess.Popen()后面的命令就开始执行了。...向stdin发送数据,或stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。...同样,如果希望stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。...那么坑爹的问题来了:当你要使用Python的subprocess.Popen实现命令行之间的管道传输,同时数据源又非常大(比如读取上GB的文本或者无尽的网络流)时,官方文档不建议用wait,同时communicate...(startMySQL,shell=True,stdout=stdout=subprocess.PIPE),子进程mysql_safe是无任何返回输出的,使用,child.communicate()或者读取

    1.9K10
    领券