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

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

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

Windows マシンの場合には、Pythonは大抵の場合 C:\Python24 にインストールされますが、インストーラ実行時に変更すること ができます。 このディレクトリをあなたのパスに追加するには、 以下のコマンドをコマンドプロンプトで実行してください:

    set path=%path%;C:\python24

    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` で アクセスできるようになります。 `sys.argv` はこれは文字列からなる リストで、少なくとも一つ要素が入っています。スクリプト名も引数も指定し なければ`sys.argv[0]` は空の文字列になります。スクリプト名の代わ りに `'-'` (標準入力を意味します) を指定すると、 `sys.argv[0]` は `'-'` になります。-c command を使うと、`sys.argv[0]` は `'-c'` になります。 -m module を使った場合、 `sys.argv[0]` は モジュールのフルパスになります。-c command や -m module の後ろにオプションを指定した場合、Python インタプリタ自体はこれらの引数を処理せず、`sys.argv`を介して commandやmoduleから扱えるようになります。

##
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形式("`\n`")でなければならないことがあります。 ハッシュまたはポンド文字、すなわち "`#`" は、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 パッケージに関する問題のせいで妨げられることがあります。