Python 模块(按路径)

发布于 2024-07-19 10:14:45 字数 1030 浏览 3 评论 0原文

我正在编写 mod_python 的publisher.py 的最小替代品,

基本前提是它基于 URL 方案加载模块:

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

其中 /foo/ 可能是一个目录,而 'bar' 是 /foo/ 中可发布类中的 ExusedBar 方法索引.py。 同样,/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() 的任何文档。

I am writing a minimal replacement for mod_python's publisher.py

The basic premise is that it is loading modules based on a URL scheme:

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

Whereby /foo/ might be a directory and 'bar' is a method ExposedBar in a publishable class in /foo/index.py. Likewise /foo might map to /foo.py and bar is a method in the exposed class. The semantics of this aren't really important. I have a line:

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

Then the module is inspected for the appropriate class/functions/methods. When the process gets as far as it can the remaining URI data, /a/b/c is passed to that method or function.

This was working fine until I had /var/www/html/foo/index.py and /var/www/html/bar/index.py

When viewing in the browser, it is fairly random which 'index.py' gets selected, even though I set the first search path to '/var/www/html/foo' or '/var/www/html/bar' and then loaded __import__('index'). I have no idea why it is finding either by seemingly random choice. This is shown by:

__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"

This question then is, why would the __import__ be randomly selecting either index. I would understand this if the path was '/var/www/html' but it isn't. Secondly:

Can I load a module by it's absolute path into a module object? Without modification of sys.path. I can't find any docs on __import__ or new.module() for this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

來不及說愛妳 2024-07-26 10:14:45

我可以通过绝对方式加载模块吗
模块对象的路径? 没有
修改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))

Can I load a module by it's absolute
path into a module object? Without
modification of sys.path. I can't find
any docs on __import__ or new.module()
for this.

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))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文