【问题标题】:Python subprocess: chaining commands with subprocess.runPython 子进程:使用 subprocess.run 链接命令
【发布时间】:2016-03-12 20:51:48
【问题描述】:

我正在 Python 3.5 中试验subprocess.run。要将两个命令链接在一起,我认为以下应该可以工作:

import subprocess

ps1 = subprocess.run(['ls'], universal_newlines=True, stdout=subprocess.PIPE)
ps2 = subprocess.run(['cowsay'], stdin=ps1.stdout)

但是,这失败了:

AttributeError: 'str' object has no attribute 'fileno'

ps2 期待一个类似文件的对象,但 ps1 的输出是一个简单的字符串。

有没有办法将命令与subprocess.run 链接在一起?

【问题讨论】:

    标签: python-3.x subprocess python-3.5


    【解决方案1】:

    原来subprocess.run 有一个input 参数来处理这个问题:

    ps1 = subprocess.run(['ls'], universal_newlines=True, stdout=subprocess.PIPE)
    ps2 = subprocess.run(['cowsay'], universal_newlines=True, input=ps1.stdout)
    

    此外,以下内容也可以使用,但不使用input

    ps1 = subprocess.run(['ls'], universal_newlines=True, stdout=subprocess.PIPE)
    ps2 = subprocess.run(['cowsay', ps1.stdout], universal_newlines=True)
    

    【讨论】:

      【解决方案2】:

      subprocess.run() 不能用于在没有 shell 的情况下实现 ls | cowsay,因为它不允许同时运行各个命令:每个 subprocess.run() 调用都等待进程完成,这就是它返回 @987654325 的原因@object(注意那里的“完成”一词)。 ps1.stdout 在您的代码中是一个字符串,这就是为什么您必须将其作为 input 传递,而不是需要文件/管道的 stdin 参数(有效的 .fileno())。

      要么使用shell:

      subprocess.run('ls | cowsay', shell=True)
      

      或者使用subprocess.Popen,并发运行子进程:

      from subprocess import Popen, PIPE
      
      cowsay = Popen('cowsay', stdin=PIPE)
      ls = Popen('ls', stdout=cowsay.stdin)
      cowsay.communicate()
      ls.wait()
      

      How do I use subprocess.Popen to connect multiple processes by pipes?

      【讨论】:

      • 谢谢。我知道 Popen 语法,但专门寻找如何在 Python 3.5+ 中使用subprocess.run 链接命令。而且确实可以使用input 参数链接命令到subprocess.run
      • @ChrisClark:你明白ls | cowsayoutput=$(ls); cowsay <<< "$output"之间的区别吗?
      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 2018-05-08
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 2021-04-11
      • 2015-01-13
      相关资源
      最近更新 更多