2016-08-13 8 views
-1

subprocessライブラリのcallを使用してpython3にスクリプトを作成しています。私が午前問題は、端末に入れたときに、このコマンドfind . -mtime +3 | xargs rm -rfは完全に正常に動作するということですが、私はやるときは、この:findを使用すると、Pythonのサブプロセスコールでエラーが発生する

find: paths must precede expression: | 
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression] 
1 
:私はこのようになりますエラーになってしまう

from subprocess import call 
call(["find", ".", "-mtime", "+3", "|", "xargs", "rm", "-rf"]) 

私は間違っていますか?助けてください:-)

+0

冗談なし?シェルでこのコマンドを実行した場合、3日前からPythonスクリプトをテストするファイルはありません。注意 !!!これを試してはいけない! 3日前から変更されたすべてのファイルとディレクトリを再帰的に削除するかどうかを確認するメッセージは表示されません。あなたの例を 'grep |ソート 'または' grep |例えば「殺す」。これはあまりにも破壊的です。 – chapelo

答えて

3

|はコマンド引数ではありません。 2つのコマンドを結合するためのシェル構文です。パイプを使用する

最も簡単な方法は、subprocessに単一の文字列を渡すと、シェルはそれを解析できるようにすることです。この場合は

from subprocess import call 
call("find . -mtime +3 | xargs rm -rf", shell=True) 

コマンドラインは非常に簡単ですので、それはうまく動作します。何も引用する必要はありません。

Pythonでパイプを設定できますが、それは単一の|文字ほど簡潔ではありません。

from subprocess import Popen, PIPE 
p1 = Popen(["find", ".", "-mtime", "+3"], stdout=PIPE) 
p2 = Popen(["xargs", "rm", "-rf"], stdin=p1.stdout) 
p1.stdout.close() 
p2.wait() 

further referenceのPythonドキュメントを参照してください。

関連する問題