IDLE --- Python のエディタとシェル¶
ソースコード: Lib/idlelib/
IDLE は Python の統合開発環境で、学習用環境です。
IDLE は次のような特徴があります:
クロスプラットホーム: Windows, Unix, macOS で動作します
コード入力、出力、エラーメッセージの色付け機能を持った Python shell (対話的インタプリタ) ウィンドウ
多段 Undo、 Python 対応の色づけ、自動的な字下げ、呼び出し情報の表示、自動補完、他たくさんの機能をもつマルチウィンドウ・テキストエディタ
任意のウィンドウ内での検索、エディタウィンドウ内での置換、複数ファイルを跨いだ検索 (grep)
永続的なブレイクポイント、ステップ実行、グローバルとローカル名前空間の視覚化機能を持ったデバッガ
設定、ブラウザ群、ほかダイアログ群
IDLE アプリケーションは idlelib パッケージで実装されています。
これは optional module です。 お使いの CPython に含まれていない場合は、配布元 (Python を提供した組織や人) のドキュメントを確認してください。 配布元の方は オプションのモジュールの要件 を参照してください。
起動とコードの実行¶
-s オプションとともに起動すると、IDLE は環境変数 IDLESTARTUP か PYTHONSTARTUP で参照されているファイルを実行します。 IDLE はまず IDLESTARTUP をチェックし、あれば参照しているファイルを実行します。 IDLESTARTUP が無ければ、IDLE は PYTHONSTARTUP をチェックします。これらの環境変数で参照されているファイルは、IDLE シェルでよく使う関数を置いたり、一般的なモジュールの import 文を実行するのに便利です。
加えて、Tk もスタートアップファイルがあればそれをロードします。その Tk のファイルは無条件にロードされることに注意してください。このファイルは .Idle.py で、ユーザーのホームディレクトリから探されます。このファイルの中の文は Tk の名前空間で実行されるので、IDLE の Python シェルで使う関数を import するのには便利ではありません。
コマンドラインでの使用¶
IDLE は、さまざまなオプションを指定してコマンドラインから起動できます。 一般的な構文は次のとおりです。
python -m idlelib [options] [file ...]
以下のオプションを使えます。
- -c <command>¶
指定した Python コマンドを Shell ウィンドウで実行します。 例えば
-c "print('Hello, World!')"を渡します。 Windows では、例のように外側の引用符をダブルクォートにする必要があります。
- -d¶
デバッガを有効にし、Shell ウィンドウを開きます。
- -e¶
Editor ウィンドウを開きます。
- -h¶
有効なオプションの組み合わせを示すヘルプメッセージを表示して終了します。
- -i¶
Shell ウィンドウを開きます。
- -r <file>¶
指定したファイルを Shell ウィンドウで実行します。
- -s¶
Shell ウィンドウを開く前に、環境変数
IDLESTARTUPまたはPYTHONSTARTUPで指定した起動ファイルを実行します。
- -t <title>¶
Shell ウィンドウのタイトルを設定します。
- -¶
Shell ウィンドウで標準入力を読み込んで実行します。 このオプションは、引数より前の最後のオプションとして指定する必要があります。
引数を指定した場合:
If
-,-c, or-ris used, all arguments are placed insys.argv[1:], andsys.argv[0]is set to'','-c', or'-r'respectively. No editor window is opened, even if that is the default set in the Options dialog.それ以外の場合、引数は編集のために開くファイルとして扱われ、
sys.argvには IDLE 自身に渡した引数が反映されます。
起動の失敗¶
IDLE は、IDLE の GUI プロセスとユーザーコードの実行プロセスとの通信にソケットを使います。
Shell の起動時と再起動時には、接続を確立する必要があります (再起動時は「RESTART」という区切り行が表示されます)。
ユーザープロセスが GUI プロセスへの接続に失敗すると、通常は「cannot connect」メッセージを含む Tk のエラーボックスが表示され、この節を参照するよう案内します。
その後、プロセスは終了します。
Unix システムでの接続失敗の原因の 1 つは、ネットワーク設定内のマスカレード規則の誤りです。
端末から IDLE を起動すると、** Invalid host: で始まるメッセージが表示されます。
有効な値は 127.0.0.1 (idlelib.rpc.LOCALHOST) です。
一方の端末ウィンドウで tcpconnect -irv 127.0.0.1 6543 を、別のウィンドウで tcplisten <same args> を実行して診断できます。
よくある失敗の原因は、random.py や tkinter.py など、標準ライブラリのモジュールと同じ名前を持つ利用者作成のファイルです。 実行しようとしているファイルと同じディレクトリにそのようなファイルがあると、IDLE は標準ライブラリのファイルをインポートできません。 現在の対処方法は、利用者が作成したファイルの名前を変更することです。
以前ほど多くはありませんが、ウイルス対策やファイアウォールのプログラムが接続を妨げることがあります。 そのプログラムで接続を許可する設定ができない場合は、IDLE を動作させるために無効にする必要があります。 この内部接続のデータは外部ポートから見えないため、許可しても安全です。 同様に、ネットワークの設定ミスが接続を妨げる場合もあります。
Python installation issues occasionally stop IDLE: multiple versions can clash, or a single installation might need admin access. If one undo the clash, or cannot or does not want to run as admin, it might be easiest to completely remove Python and start over.
残存する pythonw.exe プロセスが問題になる場合があります。 Windows では、タスクマネージャーでそのようなプロセスがないか確認し、あれば停止してください。 プログラムのクラッシュや Keyboard Interrupt (control-C) による再起動で、接続に失敗することがあります。 一時的な問題なら、エラーボックスを閉じるか、Shell メニューの Restart Shell を使うと解決する場合があります。
IDLE は最初の起動時に、~/.idlerc/ (~ はユーザーのホームディレクトリ) のユーザー設定ファイルを読み込もうとします。
問題があれば、エラーメッセージが表示されるはずです。
偶発的なディスク障害を除けば、ファイルを手で編集しないことでこの問題を防げます。
代わりに、Options の設定ダイアログを使ってください。
ユーザー設定ファイルにエラーが起きた場合は、そのファイルを削除して設定ダイアログで設定し直すのが最善の場合があります。
IDLE がメッセージを表示せずに終了し、コンソールから起動していなかった場合は、コンソールや端末から python -m idlelib で起動し、エラーメッセージが表示されるか確認してください。
8.6.11 より古い tcl/tk を使う Unix 系システム (About IDLE で確認できます) では、特定のフォントの特定の文字が原因で tk が異常終了し、端末にメッセージを表示する場合があります。
そのような文字を含むファイルを編集するために IDLE を起動したときにも、後からその文字を入力したときにも起こりえます。
tcl/tk を更新できない場合は、より適切に動作するフォントを使うよう IDLE を設定し直してください。
ユーザーコードの実行¶
まれな例外を除き、IDLE で Python コードを実行した結果は、標準的な方法、つまりテキストモードのシステムコンソールや端末ウィンドウから Python で直接実行した結果と同じになるようにしています。
ただし、インターフェースや動作の違いが、目に見える結果に影響することがあります。
例えば、sys.modules は最初からより多くの項目を含み、threading.active_count() は 1 ではなく 2 を返します。
デフォルトでは、IDLE は Shell や Editor を動かすユーザーインターフェースのプロセスとは別の OS プロセスで、ユーザーコードを実行します。
実行プロセスでは、sys.stdin、sys.stdout、sys.stderr を、Shell ウィンドウから入力を受け取り、そこへ出力を送るオブジェクトに置き換えます。
sys.__stdin__、sys.__stdout__、sys.__stderr__ に保存された元の値は変更しませんが、None の場合もあります。
あるプロセスから別のプロセスのテキストウィジェットへ表示出力を送る処理は、同じプロセスでシステム端末へ出力するより遅くなります。
特に複数の引数を表示する場合は、各引数の文字列、各区切り文字、改行を別々に送るため、影響が大きくなります。
開発中は通常問題になりませんが、IDLE でより速く表示したい場合は、まとめて表示したいものをすべて書式化して連結し、1 つの文字列として出力してください。
書式文字列と str.join() は、フィールドや行をまとめるのに役立ちます。
実行プロセス内で作成したサブプロセスは、ユーザーコードが直接作成したものでも multiprocessing などのモジュールが作成したものでも、IDLE が置き換えた標準ストリームを引き継ぎません。
このようなサブプロセスが sys.stdin からの input や、sys.stdout または sys.stderr への print、write を使う場合は、コマンドラインウィンドウで IDLE を起動してください。
(Windows では pythonw や pyw ではなく python や py を使います。)
これにより、さらに作られたサブプロセスは、そのウィンドウを入出力に使います。
ユーザーコードが importlib.reload(sys) などで sys をリセットすると、IDLE による変更が失われ、キーボードからの入力と画面への出力が正しく動作しなくなります。
Shell がフォーカスを持つときは、Shell がキーボードと画面を制御します。 通常はこの違いを意識する必要はありませんが、キーボードや画面に直接アクセスする関数は動作しません。 キーが押されたかどうかや、押されたキーを調べるシステム固有の関数などが該当します。
実行プロセスで動く IDLE のコードは、通常なら存在しないフレームを呼び出しスタックに追加します。
追加のスタックフレームの影響を減らすため、IDLE は sys.getrecursionlimit と sys.setrecursionlimit をラップします。
ユーザーコードが直接、または sys.exit の呼び出しで SystemExit を送出すると、IDLE は終了せずに Shell のプロンプトに戻ります。
Shell でのユーザー出力¶
プログラムがテキストを出力したときの結果は、対応する出力デバイスによって決まります。
IDLE がユーザーコードを実行する場合、sys.stdout と sys.stderr は IDLE の Shell の表示領域につながっています。
その機能の一部は、内部で使う Tk の Text ウィジェットを引き継いだものです。
その他はプログラムで追加したものです。
違いが重要になる場面では、Shell は本番での実行より開発に適した設計になっています。
例えば、Shell は出力を捨てません。 無制限に Shell へ出力するプログラムは、最終的にメモリを使い切り、メモリエラーになります。 一方、システムのテキストウィンドウには、出力の最後の n 行だけを保持するものがあります。 例えば Windows のコンソールは、ユーザーが設定できる 1 ~ 9999 行を保持し、デフォルトは 300 行です。
Tk の Text ウィジェット、したがって IDLE の Shell は、Unicode の BMP (基本多言語面) に含まれる文字 (コードポイント) を表示します。 どの文字を正しい字形で表示し、どの文字を代替の四角で表示するかは、OS とインストールされたフォントによって決まります。 タブ文字の後のテキストは、次のタブ位置から始まります (タブ位置は 8「文字」ごとにあります)。 改行文字の後のテキストは、新しい行に表示されます。 その他の制御文字は、OS とフォントに応じて無視されるか、空白、四角、その他の形で表示されます。 (このような出力の中で矢印キーを使ってテキストカーソルを動かすと、間隔が予想外の動きをする場合があります。)
>>> s = 'a\tb\a<\x02><\r>\bc\nd' # 22 文字を入力します。
>>> len(s)
14
>>> s # repr(s) を表示
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='') # s をそのまま表示します。
# 結果は OS とフォントによって異なります。
# 試してみてください。
The repr function is used for interactive echo of expression
values. It returns an altered version of the input string in which
control codes, some BMP codepoints, and all non-BMP codepoints are
replaced with escape codes. As demonstrated above, it allows one to
identify the characters in a string, regardless of how they are displayed.
通常の出力とエラー出力は、一般にコード入力からも互いからも分離され、別々の行に表示されます。 それぞれに異なるハイライト色を付けます。
SyntaxError のトレースバックでは、エラーを検出した場所を示す通常の '^' の代わりに、テキストをエラーのハイライト色で表示します。 ファイルから実行したコードが他の例外を起こした場合は、トレースバックの行を右クリックして IDLE の Editor の対応する行へ移動できます。 必要ならファイルを開きます。
Shell には、出力行を「Squeezed text」ラベルに折りたたむ特別な機能があります。 N 行 (デフォルトは 50 行) を超える出力は自動で折りたたみます。 N は Settings ダイアログの General ページの PyShell セクションで変更できます。 それより少ない行の出力も、右クリックで折りたためます。 スクロールが遅くなるほど長い行に対して便利です。
折りたたんだ出力は、ラベルをダブルクリックするとその場で展開します。 ラベルを右クリックして、クリップボードに送ったり、別の表示ウィンドウに開いたりすることもできます。
tkinter アプリケーションの開発¶
tkinter プログラムを開発しやすくするため、IDLE は意図的に標準の Python と異なる動作をします。
標準の Python で import tkinter as tk; root = tk.Tk() と入力しても、何も表示されません。
IDLE で同じことを入力すると、tk ウィンドウが表示されます。
標準の Python では、ウィンドウを見るために root.update() も入力する必要があります。
IDLE は、同じ処理をバックグラウンドで 1 秒あたり約 20 回、つまり約 50 ミリ秒ごとに行います。
次に b = tk.Button(root, text='button'); b.pack() と入力してください。
この場合も、標準の Python では root.update() と入力するまで見た目は変わりません。
ほとんどの tkinter プログラムは root.mainloop() を実行します。
この呼び出しは通常、tk アプリケーションが破棄されるまで戻りません。
python -i または IDLE の Editor からプログラムを実行した場合、mainloop() が戻るまで >>> の Shell プロンプトは表示されず、
戻った時点では対話的に操作する対象が残っていません。
IDLE の Editor から tkinter プログラムを実行する場合は、mainloop の呼び出しをコメントアウトできます。 そうすると Shell プロンプトがすぐに表示され、動作中のアプリケーションを対話的に操作できます。 標準の Python で実行するときは、mainloop の呼び出しを忘れずに有効に戻してください。
サブプロセスを起こさずに起動する¶
デフォルトでは、IDLE でのユーザコードの実行は、内部的なループバックインターフェイスを使用する、ソケット経由の分離されたサブプロセスで行われます。この接続は外部からは見えませんし、インターネットとのデータの送受信は行われません。ファイアウォールソフトウェアの警告が発生しても、無視して構いません。
ソケット接続の確立を試みて失敗した場合、IDLE によって通知されます。このような失敗は一過性の場合もありますが、永続的に失敗する場合は、ファイアウォールが接続をブロックしているか、特定のシステムの設定が誤っていることが原因かもしれません。問題が解決するまでは、 IDLE をコマンドラインオプション -n で起動することもできます。
IDLE を -n コマンドラインスイッチを使って開始した場合、IDLE は単一のプロセス内で動作し、RPC Python 実行サーバを走らせるサブプロセスを作りません。これは、プラットフォーム上で Python がサブプロセスや RPC ソケットインターフェイスを作れない場合に有用かもしれません。ただし、このモードではユーザコードが IDLE 自身から隔離されませんし、Run/Run Module (F5) 選択時に環境が再起動されてまっさらな状態になることもありません。コードを変更した場合、影響するモジュールを reload() しないといけませんし、変更を反映するには、すべての特定の項目 (from foo import baz など) を再インポートしないといけません。これらの理由から、可能なら常にデフォルトのサブプロセスを起こすモードで IDLE を起動するのが吉です。
バージョン 3.4 で非推奨.
ヘルプと設定¶
ヘルプソース¶
Help メニューの「IDLE Help」は、ライブラリリファレンスの IDLE の章を整形された HTML として表示します。 読み取り専用の tkinter テキストウィンドウに表示される内容は、ウェブブラウザーで見たものに近い形です。 マウスホイール、スクロールバー、または上下の矢印キーの長押しで移動できます。 TOC (目次) ボタンをクリックし、開いたボックスから節の見出しを選ぶこともできます。
Help メニューの「Python Docs」は、チュートリアルを含む豊富なヘルプを docs.python.org/x.y で開きます。
'x.y' は、現在実行している Python のバージョンです。
システムにオフラインのドキュメントがあれば (インストール時の選択肢となっている場合があります)、代わりにそれを開きます。
Configure IDLE ダイアログの General タブを使って、任意の URL をいつでもヘルプメニューに追加したり、そこから削除したりできます。
Setting preferences [お好み設定]¶
フォント、ハイライト、キー、全般の設定は、Options メニューの Configure IDLE で変更できます。
デフォルトと異なるユーザー設定は、ユーザーのホームディレクトリにある .idlerc ディレクトリに保存されます。
不正なユーザー設定ファイルによる問題は、.idlerc 内のファイルを 1 つ以上編集または削除して解決できます。
Font タブのテキストサンプルでは、複数の言語のさまざまな文字について、フォントの種類とサイズによる表示の違いを確認できます。 サンプルを編集して、確認したい他の文字を追加してください。 サンプルを使って等幅フォントを選択できます。 Shell や Editor で特定の文字に問題がある場合は、サンプルの先頭にその文字を追加し、まずサイズを、次にフォントを変えてみてください。
Highlights タブと Keys タブで、組み込みまたは独自の配色テーマとキー設定を選びます。 新しい組み込みの配色テーマやキー設定を古い IDLE で使うには、新しい独自のテーマやキー設定として保存してください。 そうすると、古い IDLE からも使えるようになります。
macOS での IDLE¶
System Preferences の Dock で、「Prefer tabs when opening documents」を「Always」に設定できます。 この設定は IDLE が使う tk/tkinter GUI フレームワークと互換性がなく、IDLE の一部の機能が動作しなくなります。
Extensions [拡張]¶
IDLE には拡張機能の仕組みがあります。 拡張機能の設定は、設定ダイアログの Extensions タブで変更できます。 詳しくは idlelib ディレクトリ内の config-extensions.def の先頭を参照してください。 現在、デフォルトの拡張機能は、テストにも使われるサンプルの zzdummy だけです。
idlelib --- IDLE アプリケーションの実装¶
ソースコード: Lib/idlelib
Lib/idlelib パッケージは IDLE アプリケーションを実装しています。 IDLE の使い方については、このページの他の節を参照してください。
idlelib 内のファイルについては、idlelib/README.txt に説明があります。 idlelib 内でファイルを開くか、IDLE のメニューで Help => About IDLE をクリックして参照してください。 このファイルには、IDLE のメニュー項目と、それを実装するコードとの対応も記載されています。 「Startup」に挙げられたファイルを除き、idlelib のコードは、機能変更がバックポートされうるという意味で「非公開」です (PEP 434 を参照)。