gpt4 book ai didi

python - subprocess.Popen - 再次重定向标准输入

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:47 29 4
gpt4 key购买 nike

假设有一个名为“ABC”的程序,它从 stdin 读取 4 个整数并用它们做一些事情。

最近,我了解到我们可以使用管道将输入提供给 ABC,如下所示:

# send.py
import subprocess

p = subprocess.Popen(['ABC'], stdin = subprocess.PIPE)
print >>p.stdin, '1 2 3 4'

我的问题是:我们可以在调用 subprocess.Popen 后再次重定向 stdin 吗?例如,

# send.py
import subprocess

p = subprocess.Popen(['ABC'], stdin = subprocess.PIPE)
print >>p.stdin, '1 2 3'

(Redirect p.stdin to terminal's stdin)

,这样我们就可以通过在终端上输入第 4 个整数到 ABC。

最佳答案

重定向发生在 ABC 执行之前,例如(在 Unix 上)在 fork() 之后但在 execv() 之前 ( look at dup2() calls ) .在 Popen() 返回后使用相同的操作系统级别机制进行重定向为时已晚,但您可以手动模拟它。

要在进程运行时“将 p.stdin 重定向到终端的标准输入”,请调用 shutil.copyfileobj(sys.stdin, p.stdin)。可能存在缓冲问题,子进程可能会在其标准输入之外读取,例如,直接从 tty。见 Q: Why not just use a pipe (popen())?

你可能想要类似 pexpect's .interact() 的东西(未测试):

#!/usr/bin/env python
import pexpect # $ pip install pexpect

child = pexpect.spawnu('ABC')
child.sendline('1 2 3')
child.interact(escape_character=None) # give control of the child to the user

关于python - subprocess.Popen - 再次重定向标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37780898/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com