【问题标题】:How to pass the same answer to subprocess.Popen automatically?如何自动将相同的答案传递给 subprocess.Popen?
【发布时间】:2016-05-06 22:24:24
【问题描述】:

我想打电话给yes "y" | foo bar,但使用subprocess.Popen。目前我使用这个:

yes = subprocess.Popen(['yes', '""'], stdout=subprocess.PIPE)
proc = subprocess.Popen(['foo', 'bar'], stdin=yes.stdout, stdout=subprocess.PIPE)

但是,这当然不适用于 Windows。我怎样才能做到这一点,以便它适用于每个平台?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    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())

    【讨论】:

      【解决方案2】:
      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?

      【讨论】:

      • 我的主要问题是我不知道我需要回答多少次'yes',而你的回答对此并没有真正的帮助
      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 2013-12-07
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 2017-03-02
      • 2014-02-13
      • 2022-08-11
      相关资源
      最近更新 更多