子进程不能处理复杂的Unix命令



我试图在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 `('

我也试过把命令变成一个列表,但我不确定如何分解命令的基本原理是什么。有人能解释一下吗?outfilefilename为变量

["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) 

最新更新