2016-08-21 4 views
1

joinコマンドをPython内で実行しようとしていますが、私はsubprocessで騙されています。私は何千もの大きなファイルを繰り返し結合しているので、辞書には大量のメモリが必要です。私の理論的根拠は、joinは一度に2つのファイルを扱うだけなので、私のメモリオーバーヘッドは低くなります。複雑なUnixコマンドでサブプロセスが動作しない

私はsubprocessを実行しようとすると、これの多くの異なるバージョンを試してみました。なぜこれは動作していない説明することができますか? cmdを印刷してシェルで自分自身を実行すると、完全に実行されます。

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を印刷し、自分自身をシェルで実行すると、完全に動作します。

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

私はまた、リストにコマンドを回して試してみましたが、私は、コマンドを分割する方法については根拠が何であるかわかりません。誰でも説明できますか? outfilefilenameは変数

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

任意の助けをいただければ幸いです!私はPythonでこれをやっています。なぜなら、ファイル名を上流に大量に解析して、どのファイルを結合するのか把握しているからです。

答えて

2

<(は、標準のシェル構文の拡張子であるbashです。エラーメッセージで、/bin/shが実行されていて、/bin/bashではありません。 /bin/sh/bin/bashへのリンクであっても、bashはそのリンクを使用して実行されたときにその拡張子の多くを削除します。

あなたは明示的にbashを使用することができます。

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

ありがとうございました!!今すぐ完璧に動作します! – chimeric

関連する問題