如何修改python代码_python – 如何动态修改导入的源代码?

假设我有一个这样的模块文件:

# my_module.py

print("hello")

然后我有一个简单的脚本:

# my_script.py

import my_module

这将打印“你好”.

假设我想“覆盖”print()函数,所以它返回“world”.我怎么能以编程方式执行此操作(无需手动修改my_module.py)?

我想的是我需要以某种方式在导入之前或导入时修改my_module的源代码.显然,我导入后无法执行此操作,因此使用unittest.mock的解决方案是不可能的.

我还以为我可以读取文件my_module.py,执行修改,然后加载它.但这很难看,因为如果模块位于其他地方,它将无法工作.

我认为,好的解决方案是使用importlib.

我阅读了doc并找到了一个非常相交的方法:get_source(fullname).我以为我可以覆盖它:

def get_source(fullname):

source = super().get_source(fullname)

source = source.replace("hello", "world")

return source

不幸的是,我对所有这些抽象类有点迷失,我不知道如何正确执行此操作.

我徒劳地试过:

spec = importlib.util.find_spec("my_module")

spec.loader.get_source = mocked_get_source

module = importlib.util.module_from_spec(spec)

欢迎任何帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值