Python dup2恢复原始文件描述符

Python dup2恢复原始文件描述符,python,python-os,dup2,Python,Python Os,Dup2,我正试图用dup2将进程的标准输出克隆到我的程序中,它可以正常工作,除非我复制标准输出,否则我无法将其恢复到原始状态 我的代码如下 从操作系统导入fork、wait、pipe、execvp、dup2、close 从sys导入stdin def get_输入(数据): r、 w=管道() pid=fork() 旧=0 如果pid>0: 等等 关闭(w) old=dup2(r,0) 对于标准DIN中的行: 打印('data-',line.strip()) 其他: 关闭(r) dup2(w,1) ex

我正试图用dup2将进程的标准输出克隆到我的程序中,它可以正常工作,除非我复制标准输出,否则我无法将其恢复到原始状态

我的代码如下

从操作系统导入fork、wait、pipe、execvp、dup2、close
从sys导入stdin
def get_输入(数据):
r、 w=管道()
pid=fork()
旧=0
如果pid>0:
等等
关闭(w)
old=dup2(r,0)
对于标准DIN中的行:
打印('data-',line.strip())
其他:
关闭(r)
dup2(w,1)
execvp(data.split()[0],data.split())
尽管如此:
获取输入(输入())
我在while循环的第二次迭代中得到和eoferor,因为stdin仍然是管道


我尝试关闭管道通道,并尝试通过获取旧的\u fd来“重建”文件描述符,但没有改变我得到的错误。

因此,过了一段时间,我意识到没有理由将文件描述符复制到stdin,因为我不需要从进程中传递任何数据

因此,我可以使用systemcall
read
,它将读取给定给它的文件描述符的“是”

第一次从操作系统导入
读取

从操作系统导入读取
然后我删除了父进程中的所有内容,并添加了以下内容:

chunk=''
while(tmp:=读取(r,1024).decode())!="":
chunk+=tmp
关闭(r)
现在,我已经在python程序中将stdout的所有输出捕获为字符串