如何自动将相同的答案传递给subprocess.Popen?

时间:2016-01-29 08:43:52

标签: python subprocess

我想调用类似java.lang.Class的内容,但使用Class<?> getProviderClass(String customerType){ } 。目前我用这个:

yes "y" | foo bar

但是,当然,这不会在Windows上运行。我怎么能这样做才能在每个平台上运行?

2 个答案:

答案 0 :(得分:1)

p = subprocess.Popen(['/bin/cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE )
p.stdin.write("yes\nyes\nyes")

In [18]: p.communicate()
Out[18]: ('yes\nyes\nyes', None)

当然,您可以在两个线程中执行此操作(在一个线程中写入,在另一个线程中读取Popen实例)。

然而,这并不是真的安全,但是:

Can someone explain pipe buffer deadlock?

答案 1 :(得分:0)

To emulate a shell pipeline yes "y" | foo bar in Python

#!/usr/bin/env python
from subprocess import Popen, PIPE

foo_proc = Popen(['foo', 'bar'], stdin=PIPE, stdout=PIPE)
yes_proc = Popen(['yes', 'y'], stdout=foo_proc.stdin)
foo_output = foo_proc.communicate()[0]
yes_proc.wait() # avoid zombies

要在Python中管道输入(不使用yes实用程序),您可以使用threadsasync. I/O input_iteratoritertools.repeat(b'y' + os.linesep.encode())