バージョン 2.3 で 変更 された仕様: Disabled module
このモジュールには RExec クラスが含まれています。このクラスは、 r_eval()、 r_execfile()、 r_exec()および r_import() メソッドをサポートし、これらは標準の Python 関数 eval()、 execfile() および exec と import 文の制限されたバージョンです。 この制限された環境で実行されるコードは、安全であると見なされた モジュールや関数だけにアクセスします;RExec をサブクラス化すれば、 望むように能力を追加および削除できます。
[hooks[, verbose]]) |
hooks は、RHooks クラスあるいはそのサブクラスの
インスタンスです。hooks が省略されているか None
であれば、
デフォルトの RHooks クラスがインスタンス化されます。
rexec モジュールが (組み込みモジュールを含む) あるモジュールを
探したり、あるモジュールのコードを読んだりする時は常に、
rexec がじかにファイルシステムに出て行くことはありません。
その代わり、あらかじめ RHooks クラスに渡しておいたり、
コンストラクタで生成された RHooks インスタンスのメソッドを
呼び出します。
(実際には、RExec オブジェクトはこれらを呼び出しません -- 呼び出しは、RExec オブジェクトの一部であるモジュールローダ オブジェクトによって行われます。 これによって別のレベルの柔軟性が実現されます。この柔軟性は、制限された 環境内でimport 機構を変更する時に役に立ちます。 )
代替の RHooks オブジェクトを提供することで、モジュールを インポートする際に行われるファイルシステムへのアクセスを制御する ことができます。このとき、各々のアクセスが行われる順番を制御する 実際のアルゴリズムは変更されません。 例えば、RHooks オブジェクトを置き換えて、ILU のような ある種の RPC メカニズムを介することで、全てのファイルシステムの要求を どこかにあるファイルサーバに渡すことができます。 Grail のアプレットローダは、アプレットを URL からディレクトリ上に import する際にこの機構を使っています。
もし verboseが true であれば、追加のデバッグ出力が標準出力に 送られます。
制限された環境で実行するコードも、やはり sys.exit() 関数を
呼ぶことができることを知っておくことは大事なことです。制限された
コードがインタプリタから抜けだすことを許さないためには、いつでも、
制限されたコードが、SystemExit 例外をキャッチする
try/except 文とともに実行するように、呼び出しを防御します。
制限された環境から sys.exit()関数を除去するだけでは不十分です -
制限されたコードは、やはり raise SystemExit
を使うことができてしまいます。
SystemExitを取り除くことも、合理的なオプションではありません;
いくつかのライブラリコードはこれを使っていますし、これが利用できなくなると
中断してしまうでしょう。
参考: