はじめに
********

Python 標準ライブラリはモジュールの集まりです。 これらのモジュールはさ
まざまな観点で分類できます。 大部分は Python で書かれていますが、C で
書かれたものもあります。 どのモジュールもプログラムにインポートして機
能を追加できます。 スタックトレースの表示など Python 固有のインターフ
ェースを提供するものもあれば、特定のハードウェアへのアクセスなど OS 固
有のインターフェースを提供するものや、ウェブ開発など特定の応用分野のイ
ンターフェースを提供するものもあります。 Python のすべてのバージョンや
移植版で利用できるモジュールもあれば、基盤となるシステムがサポートして
いる場合や必要とする場合にのみ利用できるものもあります。 また、Python
のコンパイルとインストールの際に特定の構成オプションを選んだ場合にのみ
利用できるモジュールもあります。

このマニュアルを最初から読み始め、飽きたら次の章に進むという読み方でも
、Python ライブラリで利用できるモジュールとその応用分野をおおまかに把
握できます。 もちろん、小説のように読む *必要はありません*。 マニュア
ルの先頭にある目次を眺めたり、末尾の索引で特定の関数やモジュール、用語
を調べたりすることもできます。 また、思いがけない話題について学ぶのが
好きなら、適当なページを開いて一節か二節読んでみるのもよいでしょう。
このマニュアルをどの順番で読むにしても、まず 組み込み関数 (built-in
function) を読んでおくと役立ちます。 この節の残りの部分は、その内容を
理解していることを前提としています。

参考: "import" 文を使わずに利用できる組み込み関数とクラスは、Python 組み込
    み機能リファレンス で説明しています。


利用可能性について
==================

* 「利用できる環境 : Unix 」の意味はこの関数が Unix システムにあること
  が多いということです。このことは特定の OS における存在を主張するもの
  ではありません。

* 特に記述がない場合、「利用できる環境 : Unix 」と書かれている関数は、
  Unix をコアにしているmacOS、iOS、Androidでも利用することができます。

* 利用可能性の注釈に最小カーネルバージョンと最小 libc バージョンの両方
  が含まれている場合は、両方の条件を満たさなければなりません。例えば、
  *Availability: Linux >= 3.17 with glibc >= 2.27* という注釈付きの機
  能には、 Linux 3.17 以上と、 glibc 2.27 以上の両方が必要です。


WebAssembly プラットフォーム
----------------------------

WebAssembly プラットフォームである "wasm32-emscripten" (Emscripten) と
"wasm32-wasi" (WASI) は、 POSIX API のサブセットを提供します。
WebAssembly ランタイムとブラウザーはサンドボックス化されており、ホスト
や外部リソースへのアクセスが制限されています。プロセス、スレッド、ネッ
トワーク、シグナル、または他の形のプロセス間通信 (IPC) を使用する標準
ライブラリモジュールは、利用不可か、他の Unix ライクなシステムのように
は動作しません。ファイル I/O 、ファイルシステム、 Unix の権限関係の機
能も制限されています。 Emscripten はブロッキング I/O を許可しません。
"sleep()" のような他のブロッキング操作は、ブラウザーのイベントループを
ブロックします。

WebAssembly プラットフォーム上での Python の 性質と振る舞いは、
Emscripten-SDK や WASI-SDK のバージョン、 WASM ランタイム (ブラウザ、
NodeJS 、 wasmtime) 、Python のビルド時フラグによって決まります。
WebAssembly や Emscripten 、 WASI は標準を発展させており、ネットワーク
などの機能は将来的にサポートされるかもしれません

ブラウザ上の Python では、ユーザーは  Pyodide や PyScript を検討すべき
でしょう。 PyScript は、 Pyodide をもとにして構築されており、 Pyodide
自体は CPython や Emscripten 上に構築されています。 Pyodide は、ブラウ
ザの JavaScript と DOM API だけでなく、 JavaScript の "XMLHttpRequest"
や "Fetch" API による制限されたネットワーク機能へのアクセスを提供しま
す。

* プロセス関連の API は利用不可能か、常にエラーにより失敗します。これ
  には、新しいプロセスを作成 ("fork()" や "execve()") 、プロセスを待機
  ("waitpid()") 、シグナルを送信 ("kill()") 、もしくはプロセスと通信す
  る API が含まれます。 "subprocess" はインポート可能ですが、機能しま
  せん。

* "socket" モジュールは利用できますが、機能に制限があり、他のプラット
  フォームとは動作が異なります。 Emscripten ではソケットは常に非ブロッ
  キングで、WebSocket を介して TCP 通信を中継するための JavaScript コ
  ードとサーバー側の補助プログラムが別途必要です。 詳しくは Emscripten
  Networking を参照してください。 WASI snapshot preview 1 では、既存の
  ファイル記述子から作ったソケットのみ使用できます。

* 一部の関数は、何もせず常に決められた値を返すだけのスタブです。

* ファイル記述子、ファイルのアクセス権、ファイルの所有者、リンクに関す
  る関数には制限があり、一部の操作はサポートしていません。 例えば、
  WASI では絶対ファイル名を使ったシンボリックリンクは許可されません。


モバイルプラットフォーム
------------------------

Android と iOS は、ほとんどの点で POSIX オペレーティングシステムです。
ファイル I/O、ソケットの操作、スレッドはいずれも他の POSIX オペレーテ
ィングシステムと同じように動作します。 ただし、いくつか大きな違いがあ
ります。

* モバイルプラットフォームでは、Python は「組み込み」モードでのみ使用
  できます。 Python の REPL はなく、**python** や **pip** などの独立し
  た実行ファイルも使用できません。 モバイルアプリに Python コードを追
  加するには、Python の埋め込み API を使用する必要があります。 詳しく
  は Android で Python を使う と iOS で Python を使う を参照してくださ
  い。

* サブプロセス:

  * Android ではサブプロセスを作成できますが、公式にはサポートされてい
    ません。 特に、Android は System V IPC API を一切サポートしていな
    いため、"multiprocessing" は利用できません。

  * iOS アプリでは、サブプロセス、マルチプロセッシング、プロセス間通信
    はいずれの形式も使用できません。 iOS アプリがサブプロセスを作成し
    ようとすると、作成元のプロセスが動かなくなるかクラッシュします。
    iOS アプリは、その目的で用意された iOS 固有の API を除き、他の実行
    中のアプリケーションを調べたり、それらと通信したりすることはできま
    せん。

* モバイルアプリによるシステムリソース (システム時計など) の変更は制限
  されています。 これらのリソースは *読み取れる* 場合が多いものの、変
  更しようとすると通常は失敗します。

* コンソールの入出力:

  * Android では、ネイティブの "stdout" と "stderr" はどこにも接続され
    ていないため、Python はメッセージをシステムログに転送する独自のス
    トリームを設定します。 これらのメッセージは、それぞれ
    "python.stdout" と "python.stderr" というタグで確認できます。

  * iOS アプリで利用できるコンソール出力は限定的です。 "stdout" と
    "stderr" は *存在し*、Xcode での実行中は、そこに書き込んだ内容をロ
    グで確認できますが、システムログには *記録されません*。 アプリをイ
    ンストールしたユーザーから診断のためにアプリのログを提供してもらっ
    ても、"stdout" や "stderr" に書き込んだ内容は一切含まれません。

  * モバイルアプリには、利用可能な "stdin" がまったくありません。 アプ
    リは画面上にキーボードを表示できますが、これはソフトウェアの機能で
    あり、"stdin" に接続されているわけではありません。

    そのため、コンソールを操作する Python モジュール ("curses" や
    "readline" など) はモバイルプラットフォームでは利用できません。
