【问题标题】:How can I create a python module that returns another module如何创建一个返回另一个模块的python模块
【发布时间】:2019-09-04 03:44:23
【问题描述】:

我正在尝试制作 python 模块,该模块在导入时的行为与另一个模块完全相同。

python>
import foo
import fake_foo

help(foo) == help(fake_foo)

我需要这个,因为我需要在我的 fake_foo 模块中添加一些额外的代码 mafic 代码,它可以从另一个位置动态加载真正的模块。

如果不清楚下面的代码是否出于明显的原因不起作用:load_source 确实返回了模块,但它不能告诉 python 将其加载到当前模块。

# fake_foo/__init__.py

import imp
imp.load_source('foo', '/path/to/foo')

一个非常重要的要求是我无法控制人们如何导入fake_foo,我无法修改执行导入的代码,我需要在假模块内完成整个实现。

PS。我将需要适用于 py27、py35+ 的代码,这很可能 这将需要不同的逻辑,但一旦我让它适用于一个版本,应该不会太难为其他版本找到类似的方法。

【问题讨论】:

    标签: python python-import python-module


    【解决方案1】:

    这实际上是微不足道的。只需替换sys.modules

    在垫片模块中:

    # mod1.py
    import sys
    import mod2
    
    sys.modules["mod1"] = mod2
    

    在真实模块中:

    # mod2.py
    var = 'hello'
    

    演示:

    >>> import mod1
    >>> mod1
    <module 'mod2' from 'mod2.py'>
    >>> mod1.var
    'potato'
    

    这可能看起来很老套,但它是 Python 中的一个功能 - 导入机制故意允许这种技巧。

    这是有效的,因为导入机制正在积极启用它 hack,并在最后一步将实际模块拉出 sys.modules,加载后。 (这不是偶然的。黑客是 很久以前提出的,我们决定我们足够喜欢它来支持它 进口机械。)

    来自 GvR:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html

    【讨论】:

    • 谢谢!它似乎正在做我正在寻找的东西,只需在接受它之前再进行一些测试。我还将发布一个实际用途的链接:使用加载系统 selinux 模块的 shim pure-python selinux 模块,这将在 virtualenvs 中工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2013-06-19
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多