#
2 Python インタプリタを使う

#
1 インタプリタを起動する

Python が使える計算機なら、インタプリタはたいてい /usr/local/bin/python にインストールされています; Unix シェルのサーチパスに /usr/local/bin を入れれば、 シェルで

    python

とコマンドを入力すれば使えるようになります。 インストールする際にどのディレクトリに Python インタプリタを入れるか をオプションで指定できるので、インタプリタは他のディレクトリにあるかも しれません; 身近な Python の導師 (guru) か、システム管理者に聞いてみて ください。(例えば、その他の場所として /usr/local/python が 一般的です。)

ファイル終端文字 (Unixでは `Control-D`、DOS や Windows では `Control-Z`) を一次プロンプト (primary prompt) に入力すると、 インタプリタは終了状態ゼロで終了します。もしこの操作がうまく働かないなら、 コマンド: "`import sys; sys.exit()`" を入力することで インタプリタを終了することができます。

通常、インタプリタの行編集機能は、あまり洗練されたものではありません。 Unixシステムでは、インタプリタをインストールした誰かが GNU readline ライブラリのサポートを有効にしていれば、洗練された対話的行編集や ヒストリ機能が追加されます。 コマンドライン編集機能がサポートされているかを最も手っ取り早く 調べる方法は、おそらく最初に表示された Python プロンプトに Control-P を入力してみることでしょう。ビープ音が鳴るなら、コマンドライン編集 機能があります; 編集キーについての解説は付録 A を 参照してください。何も起こらないように見えるか、`P` が エコーバックされるなら、コマンドライン編集機能は利用できません; 現在編集中の行から文字を削除するにはバックスペースを使うしかありません。

インタプリタはさながら Unix シェルのように働きます: 標準入力 が端末に接続された状態で呼び出されると、コマンドを対話的に読み込んで 実行します; ファイル名を引数にしたり、標準入力からファイルを入力 すると、インタプリタはファイルから スクリプト を読み込んで 実行します。

インタプリタを起動する第二の方法は "`python -c command [arg] ...`"です。この形式では、シェルの -c オプションと同じように、 command に指定した文を実行します。Python 文はしばしば スペースその他のシェルにとって特殊な意味をもつ文字を含むので、 command 全体を二重引用符を囲っておくのがベストです。

Python のモジュールには、スクリプトとしても便利に使えるものがあります。 "`python -m module [arg] ...`"のようにすると、 module のソースファイルを、フルパスを指定して 起動したかのように実行できます。

"`python file`" と "`python <file`" の違いに注意してください。 後者の場合、`input()` や `raw_input()` を呼び出した 時のようにプログラム自体から入力が要求されると、その入力は ファイル から調達されます。プログラムの実行が開始される前に ファイルはすでにパーザによってファイルの終端まで読み込まれているので、 入力はすぐにファイル終端に到達します。前者の場合 (大抵はこちらの 方が望ましい動作です)、入力には Python インタプリタの標準入力に 接続された何らかのファイルまたはデバイスが充てられます。

スクリプトファイルが使われた場合、スクリプトを走らせて、そのまま対話 モードに入れると便利なことがあります。これは -i を スクリプトの前に追加することで実現できます。(前の段落で述べたのと 同じ理由から、スクリプトが標準入力から読まれた場合にはこのオプション はうまく働きません。)

##
1 引数の受け渡し

インタプリタがスクリプト名と付加な引数を受け取ると、それらは 変数 `sys.argv` としてスクリプトに渡されます。これは 文字列からなるリストになります。リストの長さは少なくとも 1 です; スクリプト名も引数も与えられなければ、`sys.argv[0]` は 空の文字列になります。スクリプト名として `'-'` (標準入力を意味 します) を与えると、`sys.argv[0]` は `'-'` に設定されます。 -c command を使うと、`sys.argv[0]` は `'-c'` に設定されます。 -m module を使った場合、 `sys.argv[0]` はモジュールのフルパスになります。-c command より後ろに あるオプションは、Python インタプリタがオプションを処理する際には 使われませんが、command から扱えるように `sys.argv` に は残されます。

##
2 対話モード

命令文を tty から読み取っているときには、インタプリタは 対話モード (interactive mode) であるといいます。 このモードでは、インタプリタは 一次プロンプト(primary prompt) を表示して次のコマンドを入力するよう促します。 一次プロンプトは普通、三つの大なり記号 ("`>`>`>` ") です; 継続する行 (continuation line) に対しては、インタプリタは 二次プロンプト (secondary prompt) を表示します。 これはデフォルトでは三つのドット ("`...` ") です。 インタプリタは、最初のプロンプトを出す前にバージョン番号と著作権表示 から始まる歓迎のメッセージを出力します。

    python
    Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06)  [GCC 2.8.1] on sunos5
    Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
    >>>

継続する行は、複数の行から構成される構文を入力するときに必要です。 例として、以下の `if` 文を見てください。

    >>> the_world_is_flat = 1
    >>> if the_world_is_flat:
    ...     print "Be careful not to fall off!"
    ...
    Be careful not to fall off!

#
2 インタプリタとその環境

##
1 エラー処理

エラーが発生すると、インタプリタはエラーメッセージとスタックトレース (stack trace) を出力します。対話モードにいるときは、インタプリタは 一次プロンプトに戻ります; 入力がファイルからきているときには、 インタプリタはスタックトレースを出力した後、非ゼロの終了状態で終了します。 (`try` 文の `except` 節で処理された例外は、ここでいうエラー にはあたりません。) いくつかのエラーは無条件に致命的であり、非ゼロの終了状態となるプログラム の終了を引き起こします; これにはインタプリタ内部の矛盾や ある種のメモリ枯渇が当てはまります。 エラーメッセージは全て標準エラー出力ストリームに書き込まれます; これに対して、実行した命令からの通常出力される内容は標準出力に 書き込まれます。

割り込み文字 (interrupt character、普通は Control-C か DEL) を 一次または二次プロンプトに対して打鍵すると、入力が取り消されて 一次プロンプトに戻ります。 1コマンドの実行中に割り込み文字を打鍵すると `KeyboardInterrupt` 例外が送出されます。この例外は `try` 文で処理できます。

##
2 実行可能な Python スクリプト

BSD 風の Unix システムでは、Python スクリプトはシェルスクリプトの ようにして直接実行可能にできます。これを行うには、以下の行

    #! /usr/bin/env python

(ここではインタプリタがユーザの PATH 上にあると仮定しています) をスクリプトの先頭に置き、スクリプトファイルに実行可能モードを 与えます。 "`#!`" はファイルの最初の２文字でなければなりません。 プラットフォームによっては、この最初の行を終端する改行文字が Mac OS 形式 ("`\r`") や Windows 形式 ("`\r\n`") で はなく、 Unix形式でなければならないことがあります。 ハッシュまたはポンド文字、すなわち "`#`" は、Python ではコメントを書き始めるために使われているので注意してください。

chmod コマンドを使えば、スクリプトに実行モード (または実行権限) を与えることができます:

    $ chmod +x myscript.py

## 3 ソースコードの文字コード方式 (encoding)

ASCII 形式でない文字コード化方式 (エンコーディング: encoding) を Python ソースコードファイル中で使うことができます。最良の方法は、 `#!` 行の 直後に一行かそれ以上の特殊なコメントを挿入して、ソースファイルのエンコード を指定するというものです:

     # -*- coding: encoding -*-

このように宣言しておくと、ソースファイル中の全ての文字は encoding という文字コードでエンコードされているものとして扱われ、Unicode 文字列 リテラルを指定したエンコードで直接記述できます。利用可能なエンコードのリストは Python ライブラリリファレンス の `codecs` の節にあります。

例えばユーロ通過記号を含む Unicode リテラルを書くには、 ISO-8859-15 エンコーディングを使えます。 ISO-8859-15 では、ユーロ 通過記号の序数 (ordinal) は 164 です。以下のスクリプトは 8364 という値 (Unicode で ユーロ記号に対応するコードポイントの値) を 出力して終了します:

     # -*- coding: iso-8859-15 -*-

     currency = u"€"
     print ord(currency)

利用しているエディタがファイルを UTF-8 バイト整列記号 (通称 BOM: Byte Order Mark) 付きの `UTF-8` で保存できる場合、エンコード 宣言の代わりに使うことができます。 IDLE は `Options/General/Default Source Encoding/UTF-8` が設定されている場合、 UTF-8 でエンコードされたファイルの識別機能をサポートします。ただし、 (2.2 以前の) 古い Python リリースは UTF-8 シグネチャを理解しませんし、 オペレーティングシステムは (Unix システムでしか使われていませんが) `#!` の行を含むスクリプトファイルを判別できなくなるので注意してください。

UTF-8 を (シグネチャやエンコード宣言を行って) 使うと、世界中の ほとんどの言語で使われている文字を文字列リテラルやコメントの中に 同時に使うことができます。識別子に対する非 ASCII 文字の使用はサポート されていません。全ての文字を正しく表示できるようにするには、使っている エディタがファイルを UTF-8 であると認識することができなければならず、 かつファイル内で使われている全ての文字をサポートするようなフォントを 使わなければなりません。

##
4 対話モード用の起動時実行ファイル

Python を対話的に使うときには、インタプリタが起動する度に実行される 何らかの標準的なコマンドがあると便利なことがよくあります。 これを行うには、PYTHONSTARTUP と呼ばれる環境変数を、 インタプリタ起動時に実行されるコマンドが入ったファイル名に設定します。 この機能は Unix シェルの .profile に似ています。

このファイルは対話セッションのときだけ読み出されます。Python がコマンドを スクリプトから読み出しているときや、 /dev/tty がコマンドの 入力元として明示的に指定されている (この場合対話的セッションのように 動作します) わけではない 場合にはこのファイルは読み出されません。 ファイル内のコマンドは、対話的コマンドが実行される名前空間と同じ名前空間内で 実行されます。このため、ファイル内で定義されていたり import された オブジェクトは、限定子をつけなくても対話セッション内で使うことができます。 また、このファイル内で `sys.ps1` や `sys.ps2` を変更して、 プロンプトを変更することもできます。

もし現在のディレクトリから追加的なスタートアップファイルを読み出したいのなら、 グローバルのスタートアップファイルの中で "`if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')`"のようなコードのプログラムを書くことができます。 スクリプト中でスタートアップファイルを使いたいのなら、以下のようにして スクリプト中で明示的に実行しなければなりません:

    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)

#### Footnotes

... 一次プロンプトに戻ります。1
  GNU Readline パッケージに関する問題のせいで妨げられることがあります。