コマンドの実行時にモジュールまたはos
モジュールよりもPythonのより具体的なメソッドを優先する4つの強力なケースがあります。os.system
subprocess
- 冗長性 -別のプロセスの生成は冗長であり、時間とリソースを浪費します。
- 移植性 -多くの
os
シェルコマンドはOS固有ですが、モジュールのメソッドの多くは複数のプラットフォームで使用できます。
- 結果の理解 -プロセスを生成して任意のコマンドを実行すると、出力からの結果を解析し、コマンドが何か問題を起こしたかどうかとその理由を理解することが強制されます。
- 安全性 -プロセスは、与えられたコマンドを実行する可能性があります。これは弱い設計であり、
os
モジュールで特定のメソッドを使用することで回避できます。
実際には、最終的なシステムコール(chmod
例では)への途中で冗長な「中間者」を実行しています。この中間者は、新しいプロセスまたはサブシェルです。
からos.system
:
サブシェルでコマンド(文字列)を実行します...
そしてsubprocess
、新しいプロセスを生成するための単なるモジュールです。
これらのプロセスを生成せずに、必要なことを実行できます。
os
モジュールの目的は、一般的なオペレーティング・システム・サービスを提供することであり、それはで説明が始まります。
このモジュールは、オペレーティングシステムに依存する機能を使用するポータブルな方法を提供します。
os.listdir
WindowsとUNIXの両方で使用できます。この機能にos.system
/ を使用しようとすると、subprocess
2つの呼び出し(ls
/ dir
)を維持し、使用しているオペレーティングシステムを確認する必要があります。これは移植性が低く、後でさらに苛立ちを引き起こします(出力の処理を参照)。
コマンドの結果を理解する:
ディレクトリ内のファイルを一覧表示するとします。
os.system("ls")
/ を使用している場合subprocess.call(['ls'])
、プロセスの出力のみを取得できこれは、基本的にファイル名を含む大きな文字列です。
名前にスペースが含まれているファイルと2つのファイルをどのように区別できますか?
ファイルを一覧表示する権限がない場合はどうなりますか?
データをPythonオブジェクトにどのようにマッピングする必要がありますか?
これらは私の頭の上にありますが、これらの問題の解決策があります-なぜあなたのために解決された問題をもう一度解決するのですか?
これは、既に存在し、自由に利用できる実装を繰り返さないことにより、Do n't Repeat Yourself原則(多くの場合「DRY」と呼ばれる)に従う例です。
安全性:
os.system
そしてsubprocess
強力です。この力が必要な場合は良いですが、必要でない場合は危険です。あなたが使用する場合はos.listdir
、あなたが知っている、それが何か他の、リストファイルを実行するか、エラーを発生させることはできません。を使用しos.system
たりsubprocess
、同じ動作を実現したりすると、意図しないことを行う可能性があります。
射出安全(シェル射出の例を参照):
ユーザーからの入力を新しいコマンドとして使用する場合、基本的に彼にシェルを与えました。これは、SQLインジェクションに似ており、ユーザーにDB内のシェルを提供します。
例は、次の形式のコマンドです。
# ... read some user input
os.system(user_input + " some continutation")
これは簡単に実行するために利用することができる任意の入力を使用して任意のコードを:NASTY COMMAND;#
最終的に作成します。
os.system("NASTY COMMAND; # some continuation")
システムを危険にさらす可能性のあるコマンドはたくさんあります。