Dynamic loader

ダイナミック・ローダ


There are two aspects of Pmw, unrelated to megawidgets, that require special attention. Firstly, Pmw is made up of many sub-modules, potentially making access to its various classes and functions cumbersome for the user. Secondly, Pmw is regularly being modified and added to, thus requiring the release of new versions. Therefore, techniques for making access to the sub-modules easy and efficient and for dealing with the different versions have been developed. These techniques are incorporated into the dynamic loader which Pmw creates when it is first imported.
メガウィジェットとは関係しないが、特別に注意を払わなければならない事が二つPmwにはある。まず、Pmwはいくつものサブ・モジュールからでき上がっており、それらの夫々のクラスや関数へのアクセスはユーザにとって厄介なものになる可能性がある。次に、Pmwは頻繁に更新・変更されており、新しいバージョンでの置き換えがたびたび必要となる。
これらの問題にたいして、サブ・モジュールへのアクセスを簡単にし、異なるバージョンの取り扱いを可能にする方法が開発された。この手法はPmwが最初にimportされた際に構築されるダイナミック・ローダに統合されている。

The first purpose of the loader is to give access to all Pmw classes and functions through a single entry point, the Pmw. prefix. For example, to access the ComboBox class (which resides in one of the sub-modules of Pmw), you just have to use Pmw.ComboBox. Without the loader, this would be a more complicated reference, such as, hypothetically, Pmw.PmwComboBox.ComboBox.
ダイナミック・ローダの第一の目的はすべてのPmwクラスと関数に一つのエントリポイントPmw接頭詞を与えることである。たとえば、ComboBoxクラス(このクラスはPmwのサブ・モジュールの一つで定義されている)にアクセスするには、Pmw.ComboBoxを
使えばよい。ダイナミック・ローダがないと、このクラスへのあくせすは、例えば、Pmw.PmwComboBox.ComboBox の様な形が必要になる。

The second purpose of the loader is to delay the importing of the sub-modules until they are needed. This improves the startup time of applications which only use a few Pmw megawidgets. It also allows more megawidgets to be added to the library without slowing down applications which do not use them.
ダイナミック・ローダの第二の目的はサブ・モジュールのimportを必要な時まで遅らせる事である。これによって、数個のメガウィジェットを使うだけのアプリケーションの起動時間が改善される。これはまた、新しいウィジェットの導入によって、それらのウィジェットを使うことのないアプリケーションを遅くすることなく、これらのウィジェットをライブラリに導入することができることを意味する。

The third purpose of the loader is to allow a script using Pmw to specify which version of Pmw it requires. This allows an application to continue working correctly even after newer releases of Pmw have been made which are not compatible with the version expected by the application. Several versions of Pmw can be installed at once, with the actual version used being specified by each application. In addition, the loader can be configured to search in one or more alpha versions of Pmw. These versions may contain new megawidgets, or new versions of existing megawidgets, that are currently not in the base releases.
ダイナミックローダの第三の目的はPmwを利用するスクリプトが利用するPmwのバージョンを指定できるようにすることである。これによって、アプリケーションが使用しているPmwと互換性のない新しいバージョンをインストールした後も、このアプリケーションが正しいバージョンのPmwを利用して動作しつづける事を可能にする。夫々のアプリケーションが明示的にバージョンを指定することで、同時に複数の異なるバージョンのPmwをインストールすることが可能である。さらに、ダイナミック・ローダを設定することで、複数のアルファバージョンを検索するようにすることができる。これらのアルファバージョンはベース・リリースに含まれていない新しいメガウィジェットや既存のメガウィジェットの新しいバージョンを含んでいてよい。
 

Several functions are available to set and query the version of Pmw being used. These are Pmw.setversion() and Pmw.setalphaversions() which specify the version and alpha versions (if any) to use for this session; Pmw.version() which returns the version(s) being used by this session; and Pmw.installedversions() which returns the version(s) of Pmw currently installed. These are described in the Pmw functions reference manual.
Pmwのバージョンを設定したり、調べたりするための関数が用意されている。それらの関数は、そのセッションで使うPmwのバージョンおよび(もし必要があれば)アルファ・バージョンを指定するためのPmw.setversion() および Pmw.setalphaversions() 、現在インストールされているPmwのバージョンのリストを値として返す Pmw.installedversions() である。これらの関数はPmw関数参照マニュアルPmw functions reference manual.に記述されている。.

When Pmw is first imported, an instance of PmwLoader is created and placed into sys.modules['Pmw']. From that point on, any reference to attributes of the Pmw 'module' is handled by the loader. The real Pmw package is stored in sys.modules['_Pmw'].
Pmwが最初にimportされると、PmwLoaderのインスタンスが生成され、sys.modules["Pmw"]に割り当てられる。これより後では、Pmw "モジュール"の属性への参照はこのローダで処理される。じっさいのPmwパッケージは、
sys.modules['_Pmw']に割り当てられる。

The loader searches the Pmw package base directory for sub-directories with the prefixes Pmw_ and Alpha_, which contain Pmw base releases and alpha releases. The version numbers are given by the part of the directory name following the prefix. These versions are available for use and are those returned by the Pmw.installedversions function. The initial version is set to the base release with the greatest version number. When the first reference to a Pmw class or function is made, the loader reads the files named Pmw.def in the current base version directory and also in the alpha directories (if any). These files list all the classes and functions supported by the version. Pmw attributes are first searched for in the alpha directories and then in the base version directory. The first directory which supports the reference is used. In this way, alpha versions override base versions.
ローダはPmwパッケージのベース・ディレクトリをPmw_およびAlpha_ではじまる名前を持つサブ・ディレクトリから探しだす。Pmw_およびAlpha_ではじまる名前を持つサブ・ディレクトリは夫々ベース・リリースおよびアルファリリースを含んでいる。バージョン番号は接頭詞(Pmw_あるいはAlpha_)に続く名前で示される。これらのバージョンは後で利用できるまたこれらのバージョン番号はPmw.installedversions ()関数の戻り値として返される。バージョンの初期値はそれらのインストールされたバージョンのうち最大のバージョン番号をもったリリースデある。最初にPmwのクラスあるいは関数にアクセスがあった時にローダは、現在のベースバージョンのディレクトリおよびアルファ・ディレクトリにあるPmw.defという名前のファイルを読み込む。これらのファイルにはそのバージョンで利用可能なすべてのクラスと関数のリストが記述されている。Pmwの属性はまずアルファ・バージョンのディレクトリから検索され、その後にベース・ディレクトリが検索される。最初にこの属性(クラス、関数、サブモジュール)をサポートするディレクトリが使われる。このようにしてアルファバージョンがベースバージョンをオーバーライドする。
 

The directory Alpha_99_9_example contains a simple example of how to structure an alpha version. The following code can be used to request that the alpha version be used and then creates an instance of a new megawidget defined in the alpha version.
ディレクトリAlpha_99_9_example にはアルファ・バージョンの構造をしめすための簡単な例が収められている。次に示すコードは使用するアルファバージョンを指定し、そのアルファバージョンで定義されている新たなメガ・ウィジェットのインスタンスを作成する。

 import Pmw
 Pmw.setalphaversions('99.9.example')

 # ベースPmwバージョンを使って標準のメッセージ・ダイアログを作成する。
 ordinary = Pmw.MessageDialog(
     message_text = 'Ordinary\nPmw Dialog')

 # アルファPmwバージョンを使ってサンプルダイアログを作成する。
 alpha = Pmw.AlphaExample()
Freezing Pmw

Since the dynamic loader requires that Pmw be installed at run time, it can not be used when freezing Pmw. In this case, a single module containing all Pmw code is required, which can then be frozen with the rest of the application's modules. The bundlepmw.py script in the Pmw bin directory can be used to create such a file. This script concatenates (almost) all Pmw megawidget files into a single file, Pmw.py, which it writes to the current directory. The script is called like this:

 bundlepmw.py [-noblt] [-nocolor] /path/to/Pmw/Pmw_X_X_X/lib
The last argument should be the path to the lib directory of the required version of Pmw. By default, the Pmw.py file imports the PmwBlt and PmwColor modules and so, to freeze an application using Pmw, you will need to copy the files PmwBlt.py and PmwColor.py to the application directory before freezing.

If you are sure that your application does not use any of the Pmw.Blt or Pmw.Color functions, you can use the -noblt or -nocolor options. In this case Pmw.py will be modified so that it does not import these module(s) and so will not need to be included when freezing the application.

If your application only uses a few Pmw megawidgets, you can remove the references to the usused ones in the files list in the bundlepmw.py code. To make the change, take a copy of the script and modify it. This will make the Pmw.py file smaller. However, be sure that you do not delete megawidgets that are components or base classes of megawidgets that you use.

Home. Pmw 0.8.4 Maintainer gregm@iname.com. 12 May 2000