我想使用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:写入输出时出错:管道破裂
gunzp:/my/dir/file1.gz:解压缩失败的
gunzip:写入输出时出错:管道破裂
gunzp:/my/dir/file12.gz:解压缩失败的
我认为这与gzip > $FILE.gz
中的重定向符号有关。
发生了什么,我该如何解决这个问题?
str.split()
不是将命令行字符串转换为参数数组的合适函数。要了解原因,请尝试:
print(str(cmd2).split())
请注意,"'gzip
、>
和$FILE.gz'"
处于不同的自变量中。
尝试:
#UNTESTED
proc2 = subprocess.Popen(shlex.split(cmd2), stdin=proc1.stdout, stdout=subprocess.PIPE)