我试图在Python中运行join
命令,并且我被subprocess
挫败。我正在迭代地组合数千个大文件,因此字典将需要大量内存。我的理由是join
一次只需要处理两个文件,所以我的内存开销会更低。
我已经尝试了许多不同的版本,试图让subprocess
运行。有人能解释一下为什么这不起作用吗?当我打印cmd
并在shell上执行它时,它运行得很好。
cmd = "join <(sort %s) <(sort %s)" % (outfile, filename)
with open(out_temp, 'w') as out:
return_code = subprocess.call(cmd, stdout=out, shell=True)
if return_code != 0:
print "not working!"
break
产生的错误如下所示。然而,当我让python打印cmd
并在shell上自己执行它时,它运行得很好。
/bin/sh: -c: line 0: syntax error near unexpected token `('
我也试过把命令变成一个列表,但我不确定如何分解命令的基本原理是什么。有人能解释一下吗?outfile
和filename
为变量
["join" , "<(sort" , outfile , ") <(sort" , filename , ")"]
任何帮助将不胜感激!我之所以在Python中这样做,是因为我在上游大量解析文件名,以确定要合并哪些文件。
<(
是bash
对标准shell语法的扩展。注意,在错误信息中,它正在运行/bin/sh
,而不是/bin/bash
;即使/bin/sh
是/bin/bash
的链接,bash
在使用该链接运行时也会丢失许多扩展名。
你可以显式地使用bash
:
cmd = "bash -c 'join <(sort %s) <(sort %s)'" % (outfile, filename)