メインコンテンツへスキップ

PythonのsubprocessでWindowsコマンドを実行

·960 文字·2 分
目次

はじめに
#

Pythonの標準ライブラリsubprocessを使ってWindowsのコマンドを実行する方法を解説する。 subprocess.run関数を使うことによって、コマンドプロンプトで実行できるコマンドを、Pythonから実行できる。

環境は以下の通り。

  • Windows 10 Home Ver. 2004
  • Python 3.7.4

コマンドを実行する
#

Windowsのコマンドを実行するには、subprocess.run関数に以下のオプションを付けて実行する。なお、echo %date%はシステムの現在の日付を表示するコマンドである。

import subprocess
res = subprocess.run("echo %date%", stdout=subprocess.PIPE, 
                     shell=True, encoding="shift-jis")

戻り値はsubprocess.CompletedProcessオブジェクトである(後述)。

オプションにstdout=subprocess.PIPEを指定することで、実行結果を文字列として得られる。 また、shell=Trueとすることで、コマンドプロンプトで実行した場合と同じ結果が得られる。ただし、任意のコマンドが実行できてしまうので、セキュリティの問題に注意されたい。 最後のencoding="shift-jis"は、(上記に例では不要だが)文字化けを防ぐために入れている。コマンドプロンプトの実行結果の文字コードはShift-JISであるが、PythonはUTF-8として解釈するため、日本語が文字化けしてしまう。こけを防ぐために指定している。

実行結果の取得
#

実行したコマンドが結果を文字列で返す場合、戻り値のstdout変数に結果が格納されている。

print(res.stdout)
# 2021/02/07

注意点
#

Windows標準のパス区切り文字は\(バックスラッシュ)であるが、Pythonではエスケープシーケンスとして解釈されるため注意する。コマンドに\を含む場合、以下のように2つ重ねるか、先頭にrを付けたraw文字列とする。

"cd abc\\def"
r"cd abc\def"

また、subprocess.runで呼び出されるのはコマンドプロンプトであるため、PowerShellのコマンドレットは実行できない。PowerShellのコマンドレットを実行するには、コマンドプロンプト経由でPowerShellを呼び出すなどする必要がある(参考リンクにあるQiita記事のコメント欄を参照)。

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Scikit-learnのPolynomialFeaturesでべき乗を求める
·1917 文字·4 分
PolynomialFeaturesクラスの引数とメソッドについて解説する。また、特徴量の数を1~3まで変化させ、オプションによって出力がどのように変化するか確認する。
【Python】ネストされたリスト・辞書とdeepcopy
·1363 文字·3 分
Pythonでネストされたリストや辞書をコピーするとき、一方に加えた変更が他方に反映されないようにしたい場合は、copyモジュールのdeepcopy()関数を用いる。deepcopy()関数によって、リスト・辞書の参照先でなく、実体が全てコピーされる。
PandasのTimestampでタイムゾーンを扱う
·1568 文字·4 分
PandasのTimestampオブジェクトにタイムゾーンを設定する方法や、異なるタイムゾーンに変換する方法について述べる。
PandasのTimestampで時刻を扱う
·2140 文字·5 分
PandasのTimestampを使った時刻の生成や、時刻オブジェクトからの属性の取得、任意形式の文字列での出力について述べる。
辞書内包表記でPandasのSeries, DataFrameを作成
·1056 文字·3 分
辞書内包表記を使って、PandasのSeries, DataFrameを少ないコード量で作成する。
Pythonのデコレータで関数に処理を追加する
·1104 文字·3 分
Pythonで関数の前後に処理を追加する、デコレータと呼ばれる機能について簡単にまとめた。