gccコンパイルをPythonで自動化


追記

コマンド"make"を用いたり、シェルのヒストリを用いたりするとプログラムを書くほどでもなさそうです。

はじめに

現在、私はC言語の勉強をしているのですが、コンパイル時に、

gcc hello.c -o hello 

と書くと大体書き間違えでコンパイルエラーが起きてしまいます。
コンパイルエラーが起きると上のコマンドをまた実行しないといけないので非常にめんどくさいです。笑
ということでPython様にお願いして自動化していきましょう。

コード作成

Pythonの標準ライブラリであるsubprocessを用いて自動化します。
subprocessはシェルの実行を行ってくれる便利なライブラリです。
試しに以下のコードを入力してみましょう。

show_dir.py
# Windowsをお使いの方はこちらのコードを実行してください。
import subprocess
subprocess.run("dir", shell=True)

# Unix系OSをお使いの方はこちらのコードを実行してください。
import subprocess
subprocess.run("ls")

以上のコードを実行すると、あたかもコマンド上でdirもしくはlsを打ったような動作をするではありませんか!
なんて便利なんでしょう!
subprocess.run()の引数に制御したいコマンドを文字列として入力すればよいそうです。
オプションを指定するのにはリストを渡せばよいそうなのですが、今回はそこまで複雑ではないので正規表現のみで解決したいと思います。

auto_gcc.py
# Windowsをお使いの方はこちらのコードを実行してください。
import subprocess
cfile = "hello"
subprocess.run("gcc " + cfile + ".c -o " + cfile, shell=True)

# Unix系OSをお使いの方はこちらのコードを実行してください。
import subprocess
cfile = "hello"
subprocess.run("gcc " + cfile + ".c -o " + cfile)

これでhello.cがコンパイルされhello.exeもしくはhello.outという実行可能形式のファイルが作成されたと思います。
さらにコンパイルが成功した場合、自動で実行されるようにしましょう。
コンパイルが成功したかどうかは以下の条件式がTrueとなればコンパイルが成功しています。

auto_gcc.py
# Windowsをお使いの方はこちらのコードを実行してください。
import os
out_cfile = cfile + ".exe"
os.path.exists(out_cfile) # Trueの場合コンパイル成功

# Unix系OSをお使いの方はこちらのコードを実行してください。
import os
out_cfile = cfile + ".out"
os.path.exists(out_cfile) # Trueの場合コンパイル成功

完成コード

以上の知識をもとにプログラムを書きます。
使い方は出てくる説明通りに操作すればよいです。

auto_gcc_and_run.py
# Windowsをお使いの方はこちらのコードを実行してください。
import subprocess
import os

while True:
    cfile = input("ファイル名を入力してください:(拡張子をつける必要はありません。終了したい場合はexitと入力してください。)")
    if cfile != "exit":
        subprocess.run("gcc " + cfile + ".c -o " + cfile, shell=True)
        out_cfile = cfile + ".exe"
        if os.path.exists(out_cfile):
            print("コンパイル完了! ファイル名: " + out_cfile)
            ans = input("実行しますか?(はいの場合はEnterを押す。いいえの場合は任意のキーを押す。")
            if ans == "":
                subprocess.run(out_cfile)
    else:
        break

# Unix系OSをお使いの方はこちらのコードを実行してください。
import subprocess
import os

while True:
    cfile = input("ファイル名を入力してください:(拡張子をつける必要はありません。終了したい場合はexitと入力してください。)")
    if cfile != "exit":
        subprocess.run("gcc " + cfile + ".c -o " + cfile, shell=True)
        out_cfile = cfile
        if os.path.exists(out_cfile):
            print("コンパイル完了! ファイル名: " + out_cfile)
            ans = input("実行しますか?(はいの場合はEnterを押す。いいえの場合は任意のキーを押す。")
            if ans == "":
                subprocess.run("./" + out_cfile)
    else:
        break

おわりに

簡素なプログラムではありますが、これを使うだけでC言語の勉強がはかどりそうです。
Pythonを使ってたらC言語勉強する意味あるのかと思っちゃいますよね笑
Unix系のOSはググった情報なので実行していません。
もし動かなければ私のせいです。コメントください。