在运行应用程序时更改Python源文件并立即反映在应用程序中是否可能?比如说,我有一个包含类Foo的foo.py文件。在另一个模块中,我在用户操作时调用Foo上的函数。现在,我想在不重启应用程序的情况下更改Foo的源代码,并在下一次用户输入时看到新代码的结果。这是否可能?
是的,但这并不被推荐——代码更改自身(尽管在某些情况下必要)通常很难调试。你需要使用reload
方法。你需要修改源文件,然后调用模块中的reload方法,然后重复这个过程。
你也可以在应用程序内部重新分配和修改代码——这不会有竞争条件的风险,同时还可以提供更一致和可测试的环境。例如,我推荐阅读Ignacio Vazquez-Abrams
的答案。
你尝试通过仅更改状态(外部配置文件、数据库条目等)来解决问题了吗?
reload
基本上存在缺陷,并且不是 OP 实际问题的正确工具。 - Mike Graham>>> from byteplay import *
>>> from pprint import pprint
>>> def f(a, b):
... print (a, b)
...
>>> f(3, 5)
(3, 5)
>>> c = Code.from_code(f.func_code)
>>> c.code[3:3] = [(ROT_TWO, None)]
>>> f.func_code = c.to_code()
>>> f(3, 5)
(5, 3)
>>> f(3, 5)
(5, 3)
class Foo(object):
def fn(self):
pass
def op1(self):
print "HELLO"
#etc
>>> a = Foo()
>>> a.fn()
>>> a.fn = a.op1
>>> a.fn()
HELLO