如何编辑内存中加载的模块?

0 投票
3 回答
635 浏览
提问于 2025-04-17 14:43

假设我有一个文件

# func.py:

def function():
    print 'Hello'
    print 'World'

还有另一个文件在同一个目录下

# load.py:

import sys
import inspect
from func import function

现在我可以通过以下方式访问这个函数的源代码:

code = inspect.getsourcelines(sys.modules['function'])

有没有办法让我修改这个函数的代码,让它打印:

"Hello There World" 而不是仅仅 "Hello World"?

我想在内存中直接修改这个函数,而不是先把源代码读出来,修改后再写到一个临时文件里,然后再导入这个临时文件。我希望能完全避免使用外部文件。

3 个回答

0

你想要一个带有参数的函数:

def function(greeting='Hello', target='World'):
    print greeting, target

在另一个文件中:

function()   #prints Hello World

function(target='To The World')  #prints Hello To The World

如果这不是你想要的,那就解释一下你的使用场景,因为我很确定你这样做会造成一个巨大的设计缺陷。

正如我在评论中提到的,自我修改的程序在40年代和50年代被使用过,但之后就不再用了。

0

你是不是在考虑用猴子补丁的方式,而不是直接替换那段代码呢?

  import func

  func.function()

  def monkey_boy():
      print "Monkey Boy"

  func.function = monkey_boy

  func.function()

这样做会得到:

Hello
World
Monkey Boy
0

这段话的意思是,它并不是直接在原来的地方修改这个函数,而是用一个新的函数替换掉了这个模块里的旧函数,而且不需要使用临时文件(这样做可能已经足够了):

import inspect
import func

code = inspect.getsourcelines(func.function)
lines = code[0]
lines.insert(2,"    print 'There'\n")

exec ''.join(lines)
func.function = function

撰写回答