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

在浏览器中查看时,选择“index.py”是相当随机的,即使我将第一个搜索路径设置为“/var/www/html/foo”或“/var/www/html/bar”并且然后加载 __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 回答