.. _tut-using:

*************************
Python インタプリタを使う
*************************

.. _tut-invoking:

インタプリタを起動する
======================

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

::

   python

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

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

   set path=%path%;C:\python26

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

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

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

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

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

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

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


.. _tut-argpassing:

引数の受け渡し
--------------

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


.. _tut-interactive:

対話モード
----------

インタプリタが命令を端末 (tty) やコマンドプロンプトから読み取っている場合、
インタプリタは *対話モード (interactive mode)* で動作しているといいます。
このモードでは、インタプリタは *一次プロンプト (primary prompt)* を表示して、
ユーザにコマンドを入力するよう促します。
一次プロンプトは普通、三つの「大なり記号」 (``>>>``) です。一つの入力が次の行まで続く
(行継続: continuation line を行う) 場合、インタプリタは
*二次プロンプト (secondary prompt)* を表示します。二次プロンプトは、
デフォルトでは三つのドット (``...``) です。
インタプリタは、最初のプロンプトを出す前にバージョン番号と著作権表示から始まる起動メッセージを出力します。

::

   python
   Python 2.6 (#1, Feb 28 2007, 00:02:06)
   Type "help", "copyright", "credits" or "license" for more information.
   >>>

行継続は、例えば以下の :keyword:`if` 文のように、複数の行からなる構文を入力するときに必要です。

::

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


.. _tut-interp:

インタプリタとその環境
======================

.. _tut-error:

エラー処理
----------

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

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


.. _tut-scripts:

実行可能な Python スクリプト
----------------------------

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

::

   #! /usr/bin/env python

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

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

::

   $ chmod +x myscript.py

Windows では、"実行モード" のような概念はありません。
Python のインストーラーは自動的に ``.py`` ファイルを ``python.exe``
に関連付けるので、 Python ファイルをダブルクリックするとそれをスクリプトとして実行します。
``.pyw`` 拡張子も(訳注: ``pythonw.exe`` に)関連付けられ、通常コンソールウィンドウを
抑制して実行します。


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

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

::

   # -*- coding: エンコーディング -*-

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

.. note::
   訳注: *エンコーディング* の部分には、
   実際には ``utf-8`` や ``cp932`` など、そのソースのエンコーディングを記述します。
   プログラムから日本語を扱う場合には、必ずある程度の文字コードの知識が必要になります。
   もし文字コードについてよく判らないのであれば、まずは英語だけ扱いながらチュートリアルを読み進めて、
   並行して文字コードについても勉強してみましょう。

   現在は、 Unicode の扱い易さの観点から、推奨される文字コードは ``utf-8`` です。
   ただし、 ``utf-8`` でソースを書いた場合、 ``utf-8`` を表示できない Windows の
   コマンドプロンプトは ``print "こんにちは"`` を実行すると文字化けを起こすでしょう。
   その場合は、互換性のために古い ``cp932`` エンコーディングを使うか、
   ``print u"こんにちは"`` のように Unicode 文字列を使います。

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

.. % For example, to write Unicode literals including the Euro currency
.. % symbol, the ISO-8859-15 encoding can be used, with the Euro symbol
.. % having the ordinal value 164.  This script will print the value 8364
.. % (the Unicode codepoint corresponding to the Euro symbol) and then
.. % exit:

::

   # -*- 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 システムでしか使われていませんが) ``#!``
の行を含むスクリプトファイルを判別できなくなるので注意してください。

.. % % If your editor supports saving files as \code{UTF-8} with a UTF-8
.. % % \emph{byte order mark} (aka BOM), you can use that instead of an
.. % % encoding declaration. IDLE supports this capability if
.. % % \code{Options/General/Default Source Encoding/UTF-8} is set. Notice
.. % % that this signature is not understood in older Python releases (2.2
.. % % and earlier), and also not understood by the operating system for
.. % +script files with \code{\#!} lines (only used on \UNIX{} systems).

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

.. % % By using UTF-8 (either through the signature or an encoding
.. % % declaration), characters of most languages in the world can be used
.. % % simultaneously in string literals and comments. Using non-\ASCII
.. % % characters in identifiers is not supported. To display all these
.. % % characters properly, your editor must recognize that the file is
.. % % UTF-8, and it must use a font that supports all the characters in the
.. % % file.


.. _tut-startup:

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

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

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

.. % % This file is only read in interactive sessions, not when Python reads
.. % % commands from a script, and not when \file{/dev/tty} is given as the
.. % % explicit source of commands (which otherwise behaves like an
.. % % interactive session).  It is executed in the same namespace where
.. % % interactive commands are executed, so that objects that it defines or
.. % % imports can be used without qualification in the interactive session.
.. % % You can also change the prompts \code{sys.ps1} and \code{sys.ps2} in
.. % % this file.

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

.. % % If you want to read an additional start-up file from the current
.. % % directory, you can program this in the global start-up file using code
.. % % like \samp{if os.path.isfile('.pythonrc.py'):
.. % % execfile('.pythonrc.py')}.  If you want to use the startup file in a
.. % % script, you must do this explicitly in the script:

::

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


.. rubric:: 脚注

.. [#] GNU Readline パッケージに関する問題のせいで妨げられることがあります。

