シェルコマンドを実行する¶
subprocess モジュールを使うことでシェルコマンドを実行できます。
- 17.5. subprocess — Subprocess management (公式ドキュメント)
シェルコマンドの実行¶
もっとも簡単なコマンドの実行方法は subprocess.call() の呼び出しです。
コマンドプロンプトで対話シェルに対して実行します。
>>> import subprocess
>>> args = ['python', '-V']
>>> subprocess.call(args)
subprocess モジュールは以下のモジュールの置き換えになりますので、 ちょっと古いブログ記事などを読む場合は気をつけましょう。
- os.system
- os.spawn*
- os.popen*
- popen2.*
- commands.*
公式ドキュメントには、それぞれのモジュールで書かれたスクリプトを置き換える方法も掲載されています。
コマンドの実行を待つ¶
少し混み入ったことを実装する場合には Popen を使います。 subprocess.call() はこれのラッパーなわけです。
大きめのファイルがあるディレクトリに対して、 du コマンドを実行してみましょう。(Linux)
import subprocess
p = subprocess.Popen(['du', '-sh', '/var/log'])
print('[Before wait] Return Code is "{}".'.format(p.returncode))
p.wait()
print('[After wait] Return Code is "{}".'.format(p.returncode))
呼び出したプロセスが終了するのを待ち受けたことが分かります。
途中結果を待ち受けるには poll() 、プロセスにデータを渡すには communicate() を使います。 timeout の指定もできますので、対話的なコマンドラインツールを実装するときにはマニュアルを読み返しましょう。
宿題¶
- 指定ディレクトリ配下の直近1週間で更新されたファイルを別のディレクトリにコピーしてください。 前回の実行でコピーしてあれば何もしないでください。
- 1. のスクリプトで、コピー元とコピー先のディレクトリを INI 形式で管理してください。 ひとつの設定ファイルで複数の実行環境を切り替えられるようにしてください。
- Wikipedia の XML 形式の記事概要ファイルをダウンロードして解凍するスクリプトを記述してください。 Index of /jawiki/latest/ - dumps.wikimedia.org からダウンロードできます。 データ量が大きいため、進捗が分かるように標準出力に何らかの情報を表示してください。
Note
Linux や Mac の場合は wget や curl でダウンロードできますが、 Windows の場合はそうしたツールが組み込まれていません。 また、”.tar.gz” や ”.tar.bz2” を解凍する方法も標準では提供されていません。 Python を使うとマルチプラットフォームに対応したツールを実装できます。