1

mod_python の publisher.py の最小限の置き換えを書いています。

基本的な前提は、URL スキームに基づいてモジュールをロードしていることです。

/foo/bar/a/b/c/d

ここで、/foo/ はディレクトリで、'bar' は /foo/index.py の公開可能なクラスの ExposedBar メソッドです。同様に、/foo は /foo.py にマップされ、bar は公開されたクラスのメソッドです。これのセマンティクスはそれほど重要ではありません。私は行を持っています:

sys.path.insert(0, path_to_file)  # /var/www/html/{bar|foo}
mod_obj = __import__(module_name)
mod_obj.__name__ = req.filename

次に、適切なクラス/関数/メソッドについてモジュールが検査されます。プロセスが残りの URI データを可能な限り取得すると、/a/b/c がそのメソッドまたは関数に渡されます。

/var/www/html/foo/index.py と /var/www/html/bar/index.py ができるまで、これはうまく機能していました

最初の検索パスを「/var/www/html/foo」または「/var/www/html/bar」に設定しても、ブラウザーで表示すると、どの「index.py」が選択されるかはかなりランダムです。次に、__import__('index') をロードしました。一見ランダムな選択でどちらかを見つける理由がわかりません。これは次のように示されます。

__name__ is "/var/www/html/foo/index.py"
req.filename is "/var/www/html/foo/index.py"
__file__ is "/var/www/html/bar/index.py"

この質問は、なぜ __import__ がいずれかのインデックスをランダムに選択するのかということです。パスが「/var/www/html」である場合、これは理解できますが、そうではありません。第二に:

モジュールオブジェクトへの絶対パスでモジュールをロードできますか? sys.path の変更なし。これに関する __import__ または new.module() に関するドキュメントが見つかりません。

4

1 に答える 1

3

モジュールオブジェクトへの絶対パスでモジュールをロードできますか? sys.path の変更なし。__import__これに関するドキュメントや new.module() が見つかりません。

import imp
import os

def module_from_path(path):
    filename = os.path.basename(path)
    modulename = os.path.splitext(filename)[0]

    with open(path) as f:
        return imp.load_module(modulename, f, path, ('py', 'U', imp.PY_SOURCE))
于 2009-05-14T13:23:56.597 に答える