Python 3.x Python子流程:将命令链接到subprocess.run

Python 3.x Python子流程:将命令链接到subprocess.run,python-3.x,subprocess,python-3.5,Python 3.x,Subprocess,Python 3.5,我正在用Python 3.5进行实验。要将两个命令链接在一起,我认为以下操作应该有效: import subprocess ps1 = subprocess.run(['ls'], universal_newlines=True, stdout=subprocess.PIPE) ps2 = subprocess.run(['cowsay'], stdin=ps1.stdout) 但是,这在以下情况下失败: AttributeError: 'str' object has no attribu

我正在用Python 3.5进行实验。要将两个命令链接在一起,我认为以下操作应该有效:

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
链接在一起?

发现
subprocess.run
有一个
输入
参数来处理此问题:

ps1 = subprocess.run(['ls'], universal_newlines=True, stdout=subprocess.PIPE)
ps2 = subprocess.run(['cowsay'], universal_newlines=True, input=ps1.stdout)
此外,以下功能也可以使用,它不使用
输入

ps1 = subprocess.run(['ls'], universal_newlines=True, stdout=subprocess.PIPE)
ps2 = subprocess.run(['cowsay', ps1.stdout], universal_newlines=True)
subprocess.run()<代码中的code>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()

谢谢。我知道Popen语法,但特别关注如何在Python 3.5+中将命令与
subprocess.run
链接起来。而且确实可以使用
input
参数将命令链接到
子流程。run
@ChrisClark:您了解:
ls | cowsay
output=$(ls)之间的区别吗;科赛