【Python入門】subprocessを使ってコマンドを実行しよう!

この記事ではPythonからコマンドを実行する方法について解説します!Pythonでコマンドを実行させたい。といった方に向けて、この記事では、

  • コマンドを扱えるsubprocessモジュールとは
  • コマンドを実行してみる
  • 外部ファイルを実行する

というsubprocessの基本的な使い方について解説していきます。さらに、

  • callとは
  • check_callとは
  • check_outputとは
  • Popenとは

などといった、少し踏み込んだところまで丁寧に解説していくので、ぜひ参考にしていってください!

なお、Pythonの記事については、こちらにまとめています。

目次

subprocessモジュールとは

最初に軽くsubprocessモジュールとは何かということに触れておこうと思います。subprocessとは冒頭でも軽く触れた通り、Pythonからコマンドを実行するためのモジュールです。

似たものに、commandsというモジュールもありますが、現在ではメンテナンスが止まっており、以降廃止されるので迷わずsubprocessを使いましょう。

コマンドを実行できるということは、外部ファイルを実行したり、現在のディレクトリから移動したり、など多彩なことがPythonから実行できるようになりますので、ぜひマスターしておきましょう!

コマンドを実行してみよう!

それでは早速、subprocessを使ってみましょう!

import subprocess
 
cmd = "ls -l"
subprocess.call(cmd.split())

実行結果

total 8
drwxr-xr-x  3 kai  staff   96  5  3 15:30 __pycache__
-rw-r--r--@ 1 kai  staff   93  5  3 15:47 cmd.py
drwxr-xr-x  4 kai  staff  128  4 29 15:15 test

基本的な使い方はこんな感じです。

まずはsubprocessをimportして、callメソッドでコマンドを実行します。ここで大切なのは、コマンドは半角スペース毎に配列で与えるということです。ここでは、splitメソッドでスペース毎に配列に入れて渡しています。

それ以外にもこのように、

import subprocess
 
subprocess.call(["ls","-l"])

実行結果

total 8
drwxr-xr-x  3 kai  staff   96  5  3 15:30 __pycache__
-rw-r--r--@ 1 kai  staff   93  5  3 15:47 cmd.py
drwxr-xr-x  4 kai  staff  128  4 29 15:15 test

直接、配列を渡して実行させる事もできます。お見せした2つのコードはどちらも同じ動作をしています。ちなみに「ls -l」はUnix系のコマンドです。詳しくはこちらの記事をご覧ください。

コマンドを実行するメソッドをいくつか見てみよう!

先程のコードでは、callメソッドでコマンドを実行しましたが、他にもいくつかあるので見ていきましょう。基本的に、実行メソッドは、

  • call
  • check_call
  • check_output
  • Popen

などがあります。callは先程解説しましたね。

ここでは、check_callとcheck_outputを解説して、その後にPopenについてをやや詳しく解説していきます。

check_callメソッドをみてみよう

check_callメソッドを見てみましょう。最初に特徴を挙げておくとcheck_callは

  • 実行時の出力、エラーは実行されたタイミングで出力される
  • 正常に実行された場合は0を返す

ということです。実際のコードと結果を見てみましょう。

import subprocess
 
cmd = "ls -l"
runcmd = subprocess.call(cmd.split())
print (runcmd)

実行結果

drwxr-xr-x  3 kai  staff   96  5  3 15:30 __pycache__
-rw-r--r--@ 1 kai  staff   78  5  3 15:54 cmd.py
drwxr-xr-x  4 kai  staff  128  4 29 15:15 test
0

このようにコマンドが実行され、しっかりと0が返ってきていることがわかりますね。

check_outメソッドをみてみよう

では次にcheck_outメソッドを見てみましょう。check_outの特徴は、

  • 実行時の出力、エラーは実行されたタイミングで出力される
  • 正常にコマンドが実行された場合は、バイト文字列で出力を返す

ということです。実際に見てみましょう。

import subprocess
 
cmd = "ls -l"
runcmd = subprocess.check_output(cmd.split())
print (runcmd)

実行結果

b'total 8ndrwxr-xr-x  3 kai  staff   96  5  3 15:30 __pycache__n-rw-r--r--@ 1 kai  staff   86  5  3 15:59 cmd.pyndrwxr-xr-x  4 kai  staff  128  4 29 15:15 testn'

このように、きちんとバイト文字列(指定された文字エンコーディング方式によって変換された文字列)で返ってきています

Popenメソッドで外部ファイルを実行させよう!

では最後にPopenメソッドを見てみましょう。Popenは、callと非常に似ています。ただ、その違いはオブジェクトを返すか返さないか、ということにあります。具体的には、

  • callは終了時のコードを返す
  • PopenはPopenオブジェクトを返す

ということです。といっても、イマイチよくわかりませんよね。具体的なコードを見てみましょう。

cmd.py

import subprocess
 
print("cmd.py start!!")

cmd = "Python3 child.py"
subprocess.Popen(cmd.split())
 
 
print("cmd.py end!!")

child.py

print("child.py start!!")
print("child.py end!!")

このように書けば、cmd.pyで外部ファイルであるchild.pyを実行することができます。実行結果を見てみましょう。

cmd.py start!!
cmd.py end!!
child.py start!!
child.py end!!

このようにPopenを使ったことにより、子プロセスの終了を待たずcmd.pyの処理が実行されました。子プロセスとは他のコードから呼び出されて実行しているコードのことを言います。この場合はcmd.pyから呼び出されているchild.pyが子プロセスになりますね。

ちなみに同じようなコードでcallを使った場合は、

実行結果

cmd.py start!!
child.py start!!
child.py end!!
cmd.py end!!

このような出力結果になります。

それぞれのコマンドの出力の違いを理解して、正しいメソッドを使うことが不具合の起きにくいプログラムを書く上で大切なのでしっかりと結果を得るだけでなく、目的にマッチしたものを使えるようになれるとよいですね!

このままPythonを学び続けて大丈夫?

なぜPythonを学ぶのか?

あなたがPythonを学ぶ理由は何でしょうか?

  • Pythonが人気だからとりあえず学んでいる
  • AIや機械学習の分野に興味があるから

Pythonは初心者向けの言語と言われています。その理由としてシンプルでわかりやすい構文や、実用的なライブラリが豊富なことが挙げられ、実際に学びやすい言語です。

しかし、もしあなたが機械学習に興味があって、とくに知識も無いまま学習を進めると、挫折する可能性が高いと言えます。

機械学習の分野はプログラミング以外にも、専門的な知識や数学の知識も必要になります。ただなんとなく学習していると早い段階でつまづきやすく、そのまま挫折してしまうなんてことも…。

そのため、挫折しないためには、

  • 最適な学習環境を用意する
  • 必要なライブラリ・ツールを導入する
  • わからないことを質問できるメンターを見つける

などが必要になります。

効率よく学びたいなら、無料カウンセリングがおすすめ

このままPythonを学び続けていいのかな…
まだまだ知りたいことがたくさんある!
もっと詳しくPythonについて知りたい!

といった悩みや願望を持っている方は、弊社「侍エンジニア」をご利用下さい。

侍エンジニアでは、

  • 現役エンジニアによるマンツーマンレッスン
  • キャリアアドバイザーによる転職・就職支援
  • 業界屈指のフリーランス・起業サポート

を受けることができます。

業界屈指のコンサルタントから、効率的な学習方法や仕事獲得術、今後のキャリアまでさまざまな疑問を相談してみませんか?遠方の方でもオンラインで受講できます!お気軽に受講下さい。

侍エンジニア
無料カウンセリングを受ける

まとめ

今回は、subprocessモジュールについて解説してきました。コマンドを実行するにも、

  • call
  • Popen
  • check_call
  • check_output

などのメソッドがあり、用途に応じた適切なものを使うことが大切です。subprocessはPythonで開発をする上でよく使うモジュールですのできちんとマスターして使いこなせるようにしましょう!

この記事を書いた人

日向徹かこよすぎか

kaikaikai8217@gmail.com

目次