1

私は python の学習初心者であり、パイプなどのコマンドラインで作業しています。

os.system の代わりにサブプロセスが推奨されていることを読みました。シェルを呼び出すスクリプトを作成していますが、サブプロセスを使用して実行できませんでした。os.system を使用するのは簡単でした:

os.system("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " + temp2.name)

私は他のコマンドで subprocess を使用して成功しましたが、複数のツールを "|" で組み合わせたものは使用しませんでした。サブプロセスの python ドキュメントを読むことは混乱を招き、私にとっては役に立ちませんでした。他の質問も検索してみましたが、私の問題に似たものを見つけることができませんでした。これは私が試した(そして失敗した)ものです:

subprocess.call = (["cut", "-f1-4", temp1.name, "|",  "uniq", "--count", "|", "sort". "-rn"], stdout = open(temp2.name, 'w'))

また、sp.call を sp.Popen に置き換えようとしましたが、失敗しました。誰でも明確な例と説明を手伝ってもらえますか? ありがとう!

4

2 に答える 2

2

優れたライブラリpython shを見てみる価値はあります。これは Python 用の本格的なサブプロセス インターフェイスであり、関数であるかのように任意のプログラムを呼び出すことができます。

この場合の特定のニーズのために、次のような「高度なパイプ」機能を提供します。

# the inner command executes first, then sends its data to the outer command
from sh import *
sort(uniq(cut("-f1-4", _in="temp1.name"), "--count"), "-rn", _out="temp2.name")
于 2012-10-15T08:44:13.427 に答える
2

パイプを使用する場合は、追加する必要がありますshell=True

subprocess.check_output("cut -f1-4 " + temp1.name + "| uniq --count | sort -rn > " +    temp2.name, shell=True)

信頼されていないソース (ユーザーが Web アプリケーションで提供したデータなど) から取得した場合、使用するとセキュリティ上のリスクが生じることに注意してくださいtemp1.nametemp2.nameshell=True

于 2012-10-15T08:26:48.047 に答える