通过路径导入Python模块
我正在写一个简单的替代品,用来替代mod_python的publisher.py。
基本的想法是根据网址的结构来加载模块:
/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__会随机选择其中一个index。我会理解如果路径是'/var/www/html',但实际上并不是。其次:
我能否通过绝对路径将一个模块加载到模块对象中?而不修改sys.path。我找不到关于__import__或new.module()的相关文档。
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))