subprocess.Popen中的Python重定向

时间:2016-05-24 15:38:18

标签: python split subprocess io-redirection

我想使用python的subprocess.Popen使用bash命令。 我的bash命令如下所示:

$ gunzip -c /my/dir/file1.gz /my/dir/file2.gz | gsplit -l 500000 --numerical-suffixes=1 --suffix-length=3 --additional-suffix=.split - /my/dir/output/file_

它接受压缩文件,解压缩它们,合并内容,将内容分成输出文件。我可以用Python这样做:

from __future__ import print_function
import subprocess
dir = "/my/dir"
files = ["file1.gz", "file2.gz"]

cmd1 = "gunzip -c {}".format(" ".join([dir+files[0], dir+files[1]]))
cmd2 = "{} -l {} --numeric-suffixes={} --suffix-length={} --additional-suffix={}  - {}"\
        .format("gsplit", 500000, 1, 3, ".split"#, "'gzip > $FILE.gz'"
                , "/my/dir/output/file_")

proc1 = subprocess.Popen(str(cmd1).split(), stdout=subprocess.PIPE)
proc2 = subprocess.Popen(str(cmd2).split(), stdin=proc1.stdout, stdout=subprocess.PIPE)

proc1.stdout.close()
proc2.wait()
print("result:", proc2.returncode)

然后我可以查看输出:

$ ls /my/dir/output
file_001.split
file_002.split
file_003.split

现在我想使用gsplit的--filter参数,它允许将结果传递给另一个命令。在这里,我选择了gzip,因为我想压缩输出。 Bash命令如下所示:

$ gunzip -c /my/dir/file1.gz /my/dir/file2.gz | gsplit -l 500000 --numerical-suffixes=1 --suffix-length=3 --additional-suffix=.split --filter='gzip > $FILE.gz' - /my/dir/output/file_

此命令有效。

现在将它放入python代码中:

from __future__ import print_function
import subprocess
dir = "/my/dir"
files = ["file1.gz", "file2.gz"]

cmd1 = "gunzip -c {}".format(" ".join([dir+files[0], dir+files[1]]))
cmd2 = "{} -l {} --numeric-suffixes={} --suffix-length={} --additional-suffix={}  --filter={} - {}"\
        .format("gsplit", 500000, 1, 3, ".split", "'gzip > $FILE.gz'"
                , "/my/dir/output/file_")

proc1 = subprocess.Popen(str(cmd1).split(), stdout=subprocess.PIPE)
proc2 = subprocess.Popen(str(cmd2).split(), stdin=proc1.stdout, stdout=subprocess.PIPE)

proc1.stdout.close()
proc2.wait()
print("result:", proc2.returncode)

唉,我收到了这个错误:

  

/ usr / local / bin / gsplit:无效选项 - 'f'

     

尝试使用'/ usr / local / bin / gsplit --help'获取更多信息。

     

gunzip:错误写入输出:管道损坏

     

gunzip:/my/dir/file1.gz:解压缩失败

     

gunzip:错误写入输出:管道损坏

     

gunzip:/my/dir/file12.gz:解压缩失败

我认为它与gzip > $FILE.gz中的重定向符号有关。

发生了什么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

str.split()不是将命令行字符串转换为参数数组的适当函数。要了解原因,请尝试:

print(str(cmd2).split())

请注意,"'gzip >$FILE.gz'"位于不同的参数中。

尝试:

#UNTESTED
proc2 = subprocess.Popen(shlex.split(cmd2), stdin=proc1.stdout, stdout=subprocess.PIPE)