このようにするshell=True
には、シェルリダイレクトが機能するようにする必要があります。
subprocess.call('sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout,shell=True)
より良い方法は次のとおりです。
with open(outpath+fnameout,'w') as fout: #context manager is OK since `call` blocks :)
subprocess.call(cmd,stdout=fout)
これにより、シェルが一緒に生成されるのを防ぎ、シェルインジェクションタイプの攻撃から安全になります。ここに、cmd
あなたのオリジナルのリストがあります、例えば
cmd = 'sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout
cmd = cmd.split()
sort
また、Pythonには非常に優れた並べ替え機能があるため、サブプロセスを介してジョブを渡す必要があるとは思えません。
最後に、str.split
文字列から引数を分割するために使用するよりも、shlex.split
引用符で囲まれた文字列を適切に処理するために使用する方がおそらく良いでしょう。
>>> import shlex
>>> cmd = "foo -b -c 'arg in quotes'"
>>> print cmd.split()
['foo', '-b', '-c', "'arg", 'in', "quotes'"]
>>> print shlex.split(cmd)
['foo', '-b', '-c', 'arg in quotes']