从python3脚本,如何将字符串传递给bash程序?

时间:2015-04-02 03:52:32

标签: python bash python-3.x pipe subprocess

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

#!/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方式吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

上面的@hyades答案当然是正确的,取决于你想要的最好,但你的第二个例子不起作用的原因是因为stdin值必须是文件类的(就像unix一样) )。以下也适用于我。

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

答案 1 :(得分:1)

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与流程进行通信

答案 2 :(得分:1)

stdin=subprocess.PIPE(重定向孩子的标准输入)添加为@hyades suggesteduniversal_newlines=True(以启用文本模式)到您的代码就足以将字符串传递给子进程:

#!/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