如何使用子进程库而不是命令编写以下行。 我们的想法是使用子流程获得相同的结果。
commands.getoutput('tr -d "\'" < /tmp/file_1.txt > /tmp/file_2.txt')
答案 0 :(得分:2)
commands.getoutput
的等效命令是subprocess.check_output
:
from subprocess import check_output
out = check_output('tr -d "\'" < /tmp/file_1.txt > /tmp/file_2.txt', shell=True)
答案 1 :(得分:1)
import subprocess
p=subprocess.Popen('tr -d "\'" < /tmp/file_1.txt > /tmp/file_2.txt',shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output=p.communicate()[0]
print "o", output
答案 2 :(得分:0)
在这种情况下,您不需要shell来运行tr
命令。因为你已经重定向了子进程'stdout;你也不需要subprocess.check_output()
:
from subprocess import check_call
with open("/tmp/file_1.txt", "rb") as input_file:
with open("/tmp/file_2.txt", "wb") as output_file:
check_call(["tr", "-d", "'"], stdin=input_file, stdout=output_file)
注意:与commands.getoutput()
不同,它不捕获stderr。如果您希望将子进程的stderr作为单独的字符串:
from subprocess import Popen, PIPE
with open("/tmp/file_1.txt", "rb") as input_file:
with open("/tmp/file_2.txt", "wb") as output_file:
p = Popen(["tr", "-d", "'"], stdin=input_file, stdout=output_file,
stderr=PIPE)
stderr_data = p.communicate()[1]
此外,您可以使用纯Python替换tr
调用:
from functools import partial
chunksize = 1 << 15
with open("/tmp/file_1.txt", "rb") as input_file:
with open("/tmp/file_2.txt", "wb") as output_file:
for chunk in iter(partial(input_file.read, chunksize), b''):
output_file.write(chunk.replace(b"'", b""))