1. ホーム
  2. python

[解決済み] なぜシェルコマンドを直接実行するのではなく、Pythonのosモジュールメソッドを使用するのですか?

2022-05-08 03:27:54

質問

ファイルやディレクトリの作成、ファイル属性の変更など、OS固有のタスクを実行するために、Pythonのライブラリ関数を使用する動機について理解しようとしています。 os.system() または subprocess.call() ?

例えば、なぜ os.chmod の代わりに os.system("chmod...") ?

シェルコマンドを直接実行するのではなく、Pythonの利用可能なライブラリメソッドを可能な限り使用することが、より"pythonic"であることは理解しています。しかし、機能的な観点からこれを行う背後にある他の動機がありますか?

ここでは、単純な1行のシェルコマンドを実行することだけを話しています。タスクの実行をより細かく制御する必要がある場合は subprocess モジュールの方がより理にかなっている、など。

どのように解決するのですか?

  1. それは より速く , os.systemsubprocess.call は新しいプロセスを作成しますが、このような単純なものには必要ありません。実際 os.systemsubprocess.call と共に shell 最初のプロセスはシェルで、2 番目のプロセスは実行中のコマンドです (もし、それが test ).

  2. いくつかのコマンドは 別プロセスで無駄 . 例えば os.spawn("cd dir/") を実行すると、子プロセスの現在の作業ディレクトリは変更されますが、Python プロセスの作業ディレクトリは変更されません。あなたは os.chdir そのために

  3. 特別な心配をする必要はありません という文字が解釈されます。 シェルによって os.chmod(path, mode) はファイル名が何であろうと動作しますが os.spawn("chmod 777 " + path) のようなファイル名では、ひどい失敗をします。 ; rm -rf ~ . (なお、この問題は subprocess.call を使わずに shell 引数で指定します)。

  4. を気にする必要はありません。 ダッシュで始まるファイル名 . os.chmod("--quiet", mode) という名前のファイルのパーミッションを変更します。 --quiet しかし os.spawn("chmod 777 --quiet") は失敗します。 --quiet は引数として解釈されます。これは subprocess.call(["chmod", "777", "--quiet"]) .

  5. が少なくなっていますね。 クロスプラットフォーム やクロスシェルに関する懸念は、Pythonの標準ライブラリが対処してくれることになっているからです。あなたのシステムには chmod コマンドを実行できますか?インストールされていますか?あなたが期待するパラメータをサポートしていますか?その os モジュールは可能な限りクロスプラットフォームであろうとし、それが不可能な場合はドキュメントを作成します。

  6. 実行中のコマンドに 出力 これは案外厄介で、移植性を気にしない場合でも、コーナーケース(スペース、タブ、改行が含まれるファイル名)を忘れてしまうことがあるからです。