前回までで、関数の宣言だけでなくif文やwhile文など様々な制御構造を紹介してきました。できることが増えてきた一方で、だんだんコンソール上でコードを全て書くのも大変になってきたのではないでしょうか。そこでここから少しの間は小休止を兼ねて、ファイルに書いたPythonコードを実行する方法を概観したいと思います。まずは「Pythonスクリプト」の実行方法についてです。
今回の内容
(1) まずは使ってみる
スクリプトを書いて保存する
まずは何も考えず、スクリプトを作って実行してみましょう。と言っても、とくに考える必要はありません。テキストエディタで、実行したいPythonのコードを記述してください。たとえば以下のように:
print("こんにちは!") print("ファイルからPythonを実行できました!")
これを「script1.py」という名前と拡張子で、適当な場所に保存しましょう。
このファイルの作成には、注意点が2つあります。
- 最後を空行にする:これは言い換えると、「最後を改行コードで終える」ということです。改行コードがないと、最後の命令をインタプリタが解釈してくれないことがあるかもしれません。現行のPythonでこのようなことは起こらないと思いますが、念のため習慣づけましょう。
- 「標準テキストファイル」として保存する:リッチテキスト(.rtf)やWordファイル(.doc、.docx)では、スクリプトとして認識されません。この機会に、プログラミング言語編集向けのテキストエディタを使ってみるとよいでしょう:
(参考)プログラミング向けテキストエディタ厳選5 +α - 拡張子は「.py」:ファイル名は何でも構いませんが、拡張子は「.py」にしましょう。他のプログラムからPythonコードだと認識されやすくなります。
スクリプトを実行する
まずややこしい問題を避けるために、スクリプトがあるディレクトリで端末エミュレータを開いてください(参考:特定のディレクトリで端末エミュレータを開く)。
スクリプトの実行には、いつもコンソールプログラムとして使っている「python」が必要になります。「script1.py」を実行する場合、以下のように入力してください:
gwappa$ python script1.py
実行結果:
こんにちは! ファイルからPythonを実行できました!
なんとこれだけで、Pythonスクリプトが実行できてしまいます。
(2) スクリプトとは
歴史と特徴
もともとコンピュータ用語としての「スクリプト(script)」は、「演劇の台本」という意味からの転用だったようです。昔の共用のコンピュータで端末にシェルコマンドを打ち込む際、定型のコマンド列を毎回人間が打たなくて済むようにファイルから実行するように進化した「シェルスクリプト」が、初期のコンピュータスクリプトの一例のようです。
(参考)
現代においても、コンピュータ用語での「スクリプト」とは概ね次のような特徴を持ちます:
- ファイルにコンピュータに対する命令が、その順番に沿って書いてあるもの
- 特定のプログラムを用いることで、そのファイルはそのまま実行することができる
「スクリプト言語」と「コンパイル言語」
上記2つの特徴は、C言語やJavaのようないわゆる「コンパイル言語」と対比されるものです。これらの言語では、プログラミング言語で書かれたコード(とくに「ソースコード(source code:もとになるコード)」とも呼ばれます)そのままではプログラムとして実行できません。なぜなら、プログラムの実行には「機械語」と呼ばれる、機械にとってわかりやすい別の言語が使われるからです(そのぶんこれらの言語の実行は速いです)。そこで「コンパイル言語」の場合、実行可能なプログラムを生成するためにプログラミング言語から機械語への翻訳が行なわれます。この作業が「コンパイル(compile:編纂)」と呼ばれる作業で、コンパイラ(compiler:編纂者)と呼ばれる特別なプログラムが行ないます。
いっぽうスクリプトの場合、コンパイルの作業が必要有りません。たとえばPythonの場合、実行可能なプログラムはPythonインタプリタそのもので、スクリプトはインタプリタに命令を与えているだけだからです。インタプリタを介する分Pythonの実行は「コンパイル言語」には速度の面で劣りますが、そのぶん少ないコードでも抽象的で複雑な操作を柔軟に実行できることが多くなります。
また「コンパイル言語」の場合、ソースコードの中身がどのような順番になっていようと、「プログラムの実行」とはmain関数の中身を実行することです(Javaの場合、「メインクラス」のmain関数になります)。これに対してスクリプトの場合、まず命令を関数の中に書く必要がありません。そして関数の外にある命令の順番が
Aをする Bをする Cをする
であれば、そのままA→B→Cの順に実行されます。その意味で、スクリプトは「コンパイル言語」のソースコードに比べて直感的で読みやすいと考えられます。
Pythonをはじめ、これに近いPerlやRuby、Groovy(あるいはこれらの祖先とも言えるsed、awkなど)といったプログラミング言語は「スクリプト言語」とも呼ばれます。これらの言語が持つひとつの大きな特徴は、「コンソールプログラムがある」「インタプリタを用いる」ということです。コンソールプログラム上では、行単位でインタプリタへの命令を入力していき、基本的には入力された順に実行されます。ですので乱暴に言えば、コンソールに入力するべき命令をそのままファイルに書いておき、コンソールに入力する代わりにファイルをそのままインタプリタに読み込ませるのがスクリプトの動作、ということになります。ちなみにC言語やJavaにはこのようなコンソールプログラムは存在しません。このような事情から「スクリプト言語」という呼び方が存在するわけです。
もちろん、「コンパイル言語」「スクリプト言語」という呼び分けはあくまで感覚的なもので、現実には両者を厳密に分けることはできません。たとえばPythonがコンパイルをしていないかといえばそうではなく、実行時にPythonコードを解析し、Pythonプログラムで処理できる形に変換した上で、それを実行しています。この変換処理はコンパイルそのものとも言えます。また最近ではGoやSwiftのように、「基本的にはコンパイルして使えるが、同時にコンソール上でも使える」というハイブリッドな特徴を備えた言語も使われています。
(3) 自作コンソールアプリケーション
ファイルで書き直す
せっかくなので、前回作ったコンソールアプリもどきをスクリプト化しましょう:
print("やあ、コンソールもどきだよ(´・ω・`)") while True: user = input("何か入力して >>> ") if len(user) == 0: print("何か入力してって言ったのに…(´・ω・`)") break else: print("ごめん、聞いてなかった(´・ω・`)") print("また遊ぼうね(´・ω・`)")
現状では非常にしょうもないことしかできませんが、特定の入力に対する反応を加えていくことでデスクトップマスコットに匹敵する機能を持たせられるかもしれません。
コメントをつける
まとまったコードを書いていると、後で読み返したときに「これは何をしようとしているのか…」と呆然としてしまうことがあります。Pythonの場合、言語の仕様上プログラムの流れ自体は比較的わかりやすくなりますが、それでも自分でロジックを組む関係上「以前の自分が理解できない!」という状況に陥ることはあります。
それを防ぐ方法はいくつかありますが(以前少し紹介したdocstringもそのひとつです)、ひとつが「コードにコメントをつける」ということです。Pythonでは、行のはじめや途中に「#」をつけることで、それ以降が「コメント」として解釈されます(ちなみに#は「ハッシュ」と読みます。Shift+3で出てきます)。コメントとして解釈されたところでは、そこに何を書いていてもインタプリタからは無視されます。
print("Hi!") #ここはコメントになります # これもコメント # print("oh...") ←このprint文は実行されません この文は実行されるのでエラーが起きます # たとえここにコメントがあっても
とくに上の例の4行目のように、特定のコードの実行をコメント化して抑える方法は「コメントアウト」とも呼ばれます。コメントアウトは試行錯誤の段階には手軽で便利ですが、本決まりのコードにコメントアウトされたコードが残っていると非常に読みづらくなります。一段落したら、思い切って消してしまいましょう。
また上の例にもある通り、Pythonには複数行まとめてコメントにする方法はありません。各行のはじめに#をつけることしかできませんので注意してください。もっとも、大概のプログラミング用テキストエディタには「まとめてコメントアウト」用のメニューやショートカットがあるはずですが。
コンソールアプリの例にコメントをつけるとすると、たとえば以下のようになります。
# 開始時に表示 print("やあ、コンソールもどきだよ(´・ω・`)") # メインループ。空行が入力されるまで回り続ける while True: user = input("何か入力して >>> ") # user (入力内容)により分岐 if len(user) == 0: # 空行入力でループから抜ける print("何か入力してって言ったのに…(´・ω・`)") break else: # デフォルトの動作 print("ごめん、聞いてなかった(´・ω・`)") # 終了時に表示 print("また遊ぼうね(´・ω・`)")
多少過剰かもしれませんが、プログラムの状態ごとに「どこでどういう判断をして、何をどう処理するか」ということを書き残しておくと、プログラムの流れを追いやすくなると思います。
(4) 次のステップ
今回はPythonでスクリプトを実行する方法について解説しました。これを知っていることで、簡単なアプリケーションなら作れるようになるかもしれませんね。次回はさらにPythonの世界を広げるべく、外部ファイルのPythonコードをコンソール上で使う方法について説明したいと思います。
続き:Pythonファイルの実行(2): モジュールを作る
“Pythonファイルの実行(1): Pythonスクリプトを作る” への 1 件のフィードバック