2016-08-21 66 views
1

我試圖在Python中運行join命令,並且我被subprocess挫敗。我將迭代地組合成千上萬個大文件,因此字典需要大量內存。我的理由是join一次只能處理兩個文件,所以我的內存開銷會更低。複雜的Unix命令無法使用的子進程

我試過很多不同的版本,試圖讓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中這樣做是因爲我大量解析上游文件名以找出要組合的文件。

回答

2

<(是對標準shell語法的擴展bash。在錯誤消息中注意它正在運行/bin/sh,而不是/bin/bash;即使/bin/sh是指向/bin/bash的鏈接,bash在使用該鏈接運行時,也會丟棄其許多擴展名。

你可以明確地使用bash

cmd = "bash -c 'join <(sort %s) <(sort %s)'" % (outfile, filename) 
+0

謝謝!!現在完美的工作! – chimeric