是否可以在运行应用程序时更改python源文件并立即在应用程序中反映这些更改?
假设我有一个类Foo的foo.py文件。在其他模块中,我在用户操作上调用Foo上的函数。现在,我想在不重新启动应用程序的情况下更改Foo的源代码,并在下一个用户输入中查看新代码的结果。
这可能吗?
答案 0 :(得分:9)
是的,但不明智 - 代码会自行更改(虽然在某些情况下是必要的)但是很难调试。您正在寻找reload
方法。你可以让它工作的方法是修改源文件,然后在模块上调用reload,然后重复。
您可以选择在应用程序本身内重新分配和修改代码 - 这不会影响竞争条件,也可以提供更加一致和可测试的环境。举个例子,我会推荐Ignacio Vazquez-Abrams
's answer。
您是否曾尝试通过仅更改状态(外部配置文件,数据库条目等)来查看可以管理的内容
答案 1 :(得分:8)
以下模块可能会改变您需要的任何内容,而不是使用它,除了捣乱:)
请注意,它不会更改您的来源,这可能会造成灾难,特别是如果您发生编码错误。 “更安全”的选择是使用byteplay
http://wiki.python.org/moin/ByteplayDoc
好的,现在让我们玩吧!假设我们要更改函数,以相反的顺序打印其参数。为此,我们将在将两个参数加载到堆栈后添加ROT_TWO操作码。看看它有多简单:
>>> 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