子进程不使用复杂的Unix命令

时间:2016-08-21 03:38:49

标签: python unix subprocess

我试图在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 print cmd并在shell上自己执行它时,它运行得很好。

/bin/sh: -c: line 0: syntax error near unexpected token `('

我也尝试将命令转换为列表,但我不确定如何分解命令的基本原理。谁能解释一下? outfilefilename是变量

["join" , "<(sort" , outfile , ") <(sort" , filename , ")"]

任何帮助将不胜感激!我在Python中这样做是因为我正在大量解析上游的文件名以找出要合并的文件。

1 个答案:

答案 0 :(得分:2)

<(是标准shell语法的bash扩展。请注意错误消息中它正在运行/bin/sh,而不是/bin/bash;即使/bin/sh是指向/bin/bash的链接,bash也会在使用该链接运行时丢弃许多扩展。

您可以明确地使用bash

cmd = "bash -c 'join <(sort %s) <(sort %s)'" % (outfile, filename) 
相关问题