2017-07-13 3 views
1

に複雑な「見つける」Linuxのシェルコマンドを実行するにはどうすればよい私は、次のコマンドを実行する必要がありは私のpython

import subprocess 

result = subprocess.Popen(["find", PATH, "-type", "f", "-exec", "du", "-h", "--all", "{}", "+"], shell=True, stdout=subprocess.PIPE).communicate()[0] 
print(result) 

をし、その結果として、私はいくらかのごみを得る。私は間違って何をしていますか?

+0

あなたは 'shell = True'は必要ありません – Barmar

+0

ごみはどのようになっていますか? – Barmar

+0

@Barmarスクリプトは、特定のディレクトリ内のすべてのファイルを一覧表示することになっています。しかし、リストされていないファイルがいくつかリストされていました。しかし、私はあなたの助言に続き、 'shell = True'を削除しました。 – BigBear

答えて

3

Popen()の最初の引数がシェルによって解析される文字列の場合は、shell=Trueを使用してください。配列の場合は、すでに必要な解析を行っているので、shell=Trueは使用しないでください。

+0

素晴らしい!今はかなり明確です。大いに感謝する! – BigBear

0
import commands 

commands = r'''find PATH -type f -exec du -h --all {} +''' 
result = commands.getstatusoutput(command)[0] 
print("{}".format(result)) 
+1

このコードをご利用いただきありがとうございます。すぐに役立つかもしれません。適切な説明は、なぜこれが問題の良い解決策であるのかを示すことによって、その教育的価値を大幅に向上させるでしょう(https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)。類似しているが同一ではない質問を持つ将来の読者にとって、より有用なものにする。説明を追加するためにあなたの答えを編集し、どのような制限と前提が適用されるかを示してください。 – basvk

+0

コマンドモジュールはos.open()でビルドされています。これは、システムコマンドを通常の文字列として受け取り、コマンドによって生成された出力とオプションで終了ステータスを含むタプルを返します。タプルの最初の項目は常に実行されるコマンドのステータスコードであり、インデックス1の項目は常にコマンドによって生成される出力です。ただし、上記のPython 2.6または3.xを使用している場合、このモジュールは動作しません 詳細https://docs.python.org/2/library/commands.html – Ajay2588