从 python3 脚本中,如何将字符串通过管道传输到 bash 程序中?

From a python3 script, how to I pipe a string into a bash program?

举个例子,这是我尝试过的:

#!/usr/bin/env python3

from subprocess import Popen

message = "Lo! I am up on an ox."
Popen('less', shell=True).communicate(input=message)

作为最后一行,我也试过了:

Popen('less', stdin=message, shell=True)

我可以做我想做的事情:

Popen('echo "%s" | less' % message, shell=True)

是否有更 pythonic 的方式来做到这一点?

谢谢!

import subprocess
p = subprocess.Popen('less', shell=True, stdout = subprocess.PIPE, stdin = subprocess.PIPE)
p.stdin.write('hey!!!'.encode('utf-8'))
print(p.communicate())

你可以设置一个PIPE来与进程

通信

@hyades 上面的答案当然是正确的,并且取决于你到底想要什么可能是最好的,但你的第二个例子不起作用的原因是因为 stdin 值必须是类似文件的(只是像 unix)。以下也适用于我。

with tempfile.TemporaryFile(mode="w") as f:
     f.write(message)
     f.seek(0)
     Popen("less", stdin=f) 

按顺序将 stdin=subprocess.PIPE(重定向 child 的标准输入)作为 universal_newlines=True(启用文本模式)添加到您的代码中就足够了将字符串传递给 child 进程:

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

message = "Lo! I am up on an ox."
Popen(['cat'], stdin=PIPE, 
      universal_newlines=True).communicate(input=message)

除非有理由,否则不要使用 shell=True