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

Python同时从管道进程和Popen子进程读取stdin

在Python中,可以使用subprocess模块来创建和管理子进程。subprocess模块提供了Popen类,可以用于执行外部命令,并与其进行交互。

对于从管道进程和Popen子进程同时读取stdin的需求,可以通过以下步骤实现:

  1. 首先,需要导入subprocess模块:
代码语言:python
代码运行次数:0
复制
import subprocess
  1. 接下来,可以使用subprocess.Popen创建一个子进程,并将其与外部命令绑定。在创建子进程时,可以指定stdin参数为subprocess.PIPE,以便从父进程中读取数据:
代码语言:python
代码运行次数:0
复制
p = subprocess.Popen(['command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

这里的command是要执行的外部命令,可以是任何可执行的命令。

  1. 然后,可以使用p.stdin.write()方法向子进程的stdin写入数据。例如,可以使用一个循环从标准输入中读取数据,并将其写入子进程的stdin
代码语言:python
代码运行次数:0
复制
while True:
    data = input()  # 从标准输入读取数据
    p.stdin.write(data.encode())  # 将数据写入子进程的stdin
    p.stdin.flush()  # 刷新stdin缓冲区

这里使用了input()函数从标准输入读取数据,并使用encode()方法将其转换为字节流。

  1. 同时,可以使用p.stdout.readline()方法从子进程的stdout读取输出结果。例如,可以在一个循环中读取子进程的输出,并将其打印到标准输出:
代码语言:python
代码运行次数:0
复制
while True:
    output = p.stdout.readline()  # 从子进程的stdout读取输出
    print(output.decode())  # 将输出解码并打印到标准输出

这里使用了decode()方法将字节流解码为字符串,并使用print()函数将其打印到标准输出。

需要注意的是,以上代码只是一个简单的示例,实际应用中可能需要根据具体需求进行适当的修改和扩展。

总结起来,通过使用subprocess.Popen创建子进程,并将其与外部命令绑定,可以实现从管道进程和Popen子进程同时读取stdin的功能。

推荐的腾讯云相关产品:腾讯云函数(Serverless云函数计算服务),腾讯云容器服务(基于Kubernetes的容器管理服务),腾讯云弹性MapReduce(大数据处理和分析服务)。

腾讯云函数产品介绍链接地址:https://cloud.tencent.com/product/scf

腾讯云容器服务产品介绍链接地址:https://cloud.tencent.com/product/tke

腾讯云弹性MapReduce产品介绍链接地址:https://cloud.tencent.com/product/emr

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

相关·内容

  • python中的subprocess

    python2.7 源码中的注释(由于能力有限,翻译的不太准确): 这个模块允许您开启进程、连接输入、输出错误的管道,并获取他们的返回代码。...stdin、stdoutstderr分别指定执行程序的标准输入,标准输出标准错误。有效值是PIPE,现有的文件描述符(正整数),现有文件对象,None。PIPE创建一个新的管道。...None,没有重定向;管道将会继承父管道的文件句柄。此外,标准错误可以用STDOUT来定义,表明应用程序应该STDOUT捕获到相同的文件句柄的标准错误数据。...在python程序中都是看作为\n 注意: 这种功能仅仅支持用通用换行符构建的python(默认)。同时文件对象标准输出、标准输入、标准错误的换行符属性,不会被communicate()模块所更新。...communicate(input=None)     与进程相互作用: 发送数据到标准输入。标准输出、标准错误读取数据, 直到到达文件尾。等待进程终止。

    1.6K30

    python 标准类库-并行执行之subprocess-进程管理

    因为不是当前进程读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...因为不是当前进程读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...因为不是当前进程读取管道(pipe),如果子进程没有生成足够的输出来填充OS的管道缓冲区,可能会阻塞子进程。...为了避免该事件,使用communicate() Popen.communicate(input=None, timeout=None) process交互:发送数据到stdinstdout,stderr...Popen.stderr 如果stdin参数为PIPE,该属性为给进程提供错误输出的文件对象,否则为None. Popen.pid 进程的ID。

    4.2K20

    supervisorPython进程multiprocessing使用 进程残留问题

    文章目录 supervisor Python的multiprocessing使用问题 #1 环境 #2 需求 #3 解决 Python进程supervisor问题 supervisor Python...的multiprocessing使用问题 #1 环境 Ubuntu 16.04 Python 3.8.1 #2 需求 使用supervisor管理Python程序时, 当Python程序中使用multiprocessing...模块,supervisor的stoprestart指令只会杀死主进程进程会残留下来 #3 解决 Python进程supervisor问题 killasgroup可以说是专门适配了Python的...multiprocessing模块,如果配置了stopasgroup=true,那么killasgroup也会默认为true,所以我们只需要配置stopasgroup=true即可,注意stopasgroupkillasgroup...配置例子 : [group:multiprocesstest] programs=multiprocess [program:multiprocess] command=python3 /home

    2.1K10

    Python标准库06 进程 (subprocess包)

    另外subprocess还提供了一些管理标准流(standard stream)管道(pipe)的工具,从而在进程间使用文本通信。...进程的文本流控制 (沿用child进程) 进程的标准输入,标准输出标准错误也可以通过如下属性表示: child.stdin child.stdout child.stderr 我们可以在Popen...()建立进程的时候改变标准输入、标准输出标准错误,并可以利用subprocess.PIPE将多个子进程的输入输出连接在一起,构成管道(pipe): import subprocess child1...child1的stdout将文本输出到缓存区,随后child2的stdin该PIPE中将文本读取走。...child2的输出文本也被存放在PIPE中,直到communicate()方法PIPE中读取出PIPE中的文本。

    2.8K60

    使用python执行shell脚本 并动态传参 及subprocess的使用详解

    这个模块可以非常方便的启动一个进程,并且控制其输入输出 Class Popen(args,bufsize = 0,executable=None, stdin =None,stdout =None...(仅限Windows) Popen对象的一些方法 Popen.poll() 检查进程是否终止,返回对象的returncode Popen.wait() 等待进程完成,阻塞。...返回returncode Popen.communicate(input=None) 将信息输入到进程stdoutstderr中读取数据,直到达到文件结尾。等待进程终止。...可选的stdin参数应该是要发送到进程的字符串,如果没有数据应发送给进程,则为None。...返回一个元组(stdout,stderr) 但是读取的数据缓存在内存中,所以如果数据量很大或者无限,就不要使用这种方法 Popen.pid 返回进程的pid Popen.returncode 读取进程的状态码

    5.5K30

    Python 执行系统命令

    官方推荐使用该模块执行系统命令,subprocess模块通过进程来执行外部指令,并通过input/output/error管道,获取进程的执行的返回信息。...3、Popen.communicate(input=None):与进程进行交互。向stdin发送数据,或stdoutstderr中读取数据。可选参数input指定发送到进程的参数。...注意:如果希望通过进程stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。...同样,如果希望stdoutstderr获取数据,必须将stdoutstderr设置为PIPE。 4、Popen.send_signal(signal):向进程发送信号。...6、Popen.kill():杀死进程。 7、Popen.stdin:如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策进程发送指令。

    1.7K10

    python—subprocess、gl

    ()       # 终止进程 child.pid               #存储进程的PID 2.进程的文本流控制 进程的标准输入、标准输出标准错误如下属性分别表示: child.stdin...child.stdout child.stderr 可以在Popen()建立进程的时候改变标准输入、标准输出标准错误,并可以利用subprocess.PIPE将多个子进程的输入输出连接在一起,构成管道...(pipe);如没有写stdinstdout,默认将进程执行结果打印至屏幕上,而不是保存于内存中 例1: #!...child1的stdout将文本输出到缓存区,随后child2的stdin该PIPE中将文本读取走。...child2的输出文本也被存放在PIPE中,直到communicate()方法PIPE中读取出PIPE中的文本;communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到进程完成

    1.5K20

    自带的 print 函数居然会报错?

    根据官方文档的解释,该函数会执行 fork 一个进程执行 command 这个命令,同时进程的标准输出通过管道连接到父进程; 也就该方法返回的文件描述符。...比如这次提到的 Python 中的 os.popen() 就是创建了一个进程,既然是进程那肯定是需要和父进程进行通信才能达到协同工作的目的。...父进程进程: 可以看到进程的标准输出与父进程关联,也就是 popen() 所返回的那个文件描述符。...总结 一些基础知识在排查一些诡异问题时显得尤为重要,比如本次涉及到的父子进程管道通信,最后来总结一下: os.popen() 函数是异步执行的,如果需要拿到进程的输出,需要自行调用 read() 函数...父子进程是通过匿名管道进行通信的,当读取端关闭时,写入端输出到达管道最大缓存时会收到 SIGPIPE 信号,从而抛出 Broken pipe 异常。 进程会继承父进程的文件描述符。

    69810

    subprocess:Python中创建进程

    前言 subprocess库提供了一个API创建进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入输出通道来回传数据。...直接处理管道 subprocess库还有一个非常重要的类Popen,它是用来建立其他API的底层API,对更复杂的进程交互很有用。...比如run(),call(),check_call()check_output()函数都是Popen类的包装器。直接使用Popen可以更好的控制如何运行命令以及如何处理输入输出流。...Popen的构造函数利用参数建立新进程,使父进程可以通过管道与之通信。 下面,我们来分别介绍进程间通信的方式。...与进程的单项通信 要运行一个进程读取它的所有输出,可以设置stdout为PIPE并调用communicate()函数。

    52570

    Python Subprocess库详解

    简介 Subprocess库是Python中用于创建和管理进程的标准库。它提供了一个强大而灵活的接口,使得你可以在Python中启动新的进程、连接它们的输入输出,并与它们进行交互。...=subprocess.PIPE参数将进程的标准输出标准错误输出捕获到父进程,然后通过循环实时读取输出。...进程间的数据传递 除了使用管道进行进程间通信,Subprocess库还支持使用subprocess.send_signal()subprocess.terminate()等方法向进程发送信号。...使用subprocess.Popenstdin参数进行输入流重定向 subprocess.Popenstdin参数允许你文件或其他可迭代对象中重定向输入流。...() print(output) 在这个例子中,stdin参数被设置为一个打开的文件对象,文件中读取输入并传递给进程

    2.3K21

    pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)

    经过研究,上结论: os.popen 会打开一个管道执行命令,而管道是有输入(stdin)、输出(stdout) 的!...如果是PIPE,则表示需要创建一个新的管道,如果是 None,不会做任何重定向工作,进程的文件描述符会继承父进程的。...如果把universal_newlines设置成True,则进程的stdoutstderr被视为文本对象,并且不管是unix/linux的换行符(’\n’),还是老mac格式的换行符(’\r’),还是...如果指定了startupinfocreationflags,它们将会被传递给后面的CreateProcess()函数,用于指定子程序的各种其他属性,比如主窗口样式或者是进程的优先级等。...现在回到我们将要解决的问题 已知: 用pyinstaller的-w参数打包导致python无法处理输入值(stdin) os.popen 打开的管道却需要处理输入值(stdin) 所以,我们不使用os.popen

    3.8K30

    python笔记65 - Python3 subprocess执行命令行获取返回结果

    前言 subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。 Popen 是 subprocess的核心,进程的创建和管理都靠它处理。...cwd: 用于设置进程的当前目录。 env: 用于指定子进程的环境变量。 如果 env = None,进程的环境变量将从父进程中继承。...wait(timeout): 等待进程终止。 communicate(input,timeout): 进程交互,发送读取数据。...send_signal(singnal): 发送信号到进程 。 terminate(): 停止进程,也就是发送SIGTERM信号到进程。 kill(): 杀死进程。...发送 SIGKILL 信号到进程。 其它方法参考菜鸟教程https://www.runoob.com/w3cnote/python3-subprocess.html

    9K20
    领券