我正在为mod_python的publisher.py
编写一个最小的替代品基本前提是它是基于URL方案加载模块:
/foo/bar/a/b/c/d
Whereby / 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()的任何文档。
答案 0 :(得分: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))