2

subprocess.call関数を初めて使用し、同じ呼び出しのさまざまな組み合わせを試しましたが、機能していません。

次のコマンドを実行しようとしています。

cmd = 'sort -k1,1 -k4,4n -k5,5n '+outpath+fnametempout+' > '+outpath+fnameout
print cmd

電話をかけようとすると、エラーが発生します。

cmd = cmd.split(" ")
print cmd
subprocess.call(cmd)

私が得るエラーは次のとおりです。

sort: stat failed: >: No such file or directory
4

3 に答える 3

12

このようにする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']
于 2013-01-17T19:41:29.437 に答える
2

Pythonで上記のコマンドを実行することは複雑ではありません:

import subprocess
import sys
proc = subprocess.Popen(['sort','-k1','1', '-k4','4n', '-k5','5n',    '+outpath+fnametempout+', '>', '+outpath+fnameout'],stdin=subprocess.PIPE)
proc.communicate()
于 2015-10-03T15:06:23.187 に答える