2009-05-14 2 views
1

によって、私は基本的な前提は、それがURLスキームに基づいてモジュールをロードしているということですmod_pythonののpublisher.pyPythonのモジュールパス

のための最小限の交換を書いています:

/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'に設定してから__import __( 'index')をロードしても 'index.py'が選択されます。一見無作為の選択によってどちらが見つかったのか分かりません。これは次のように表示されます:

この質問は、なぜ__import__がどちらのインデックスをランダムに選択するのでしょうか。パスが '/ var/www/html'だったのであれば分かりますが、そうではありません。第2に、

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

+0

TurboGearsを改革していますか? http://turbogears.org/ –

+0

いいえ、ちょうど私が必要としていることを行う、まともな出版社を探しています。このように手を汚すことは、Pythonを学ぶ良い方法です。 –

+0

実際、私の質問は修辞的でした。彼らが何をしているかを非常に詳しく見たいと思うかもしれません、それはあなたに多くの時間と労力を節約するかもしれません。 –

答えて

2

モジュールをロードすることはできますか? モジュールオブジェクトへの絶対パスですか?せずに 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)) 
+0

素晴らしい。どうもありがとう。 Pythonに新しくなったので、インポートにはC言語のdlopen()のような簡単なパスの仕組みが必要です。 –

+0

は魅力的です:) thanks dF –

関連する問題