スライドショー

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

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

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

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

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

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

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__
[email protected] 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__
[email protected] 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系のコマンドです。詳しくはこちらの記事をご覧ください。

【Linuxコマンド】lsでファイルを一覧表示する方法
更新日 : 2019年10月15日

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

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

  • call
  • check_call
  • check_output
  • Popen

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

ここでは、check_callcheck_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__
[email protected] 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 8\ndrwxr-xr-x  3 kai  staff   96  5  3 15:30 __pycache__\[email protected] 1 kai  staff   86  5  3 15:59 cmd.py\ndrwxr-xr-x  4 kai  staff  128  4 29 15:15 test\n'

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

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で開発をする上でよく使うモジュールですのできちんとマスターして使いこなせるようにしましょう!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

かい

かい

日向徹かこよすぎか

[email protected]