从 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
。
举个例子,这是我尝试过的:
#!/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
。