运行时更改python源

时间:2011-09-27 17:58:26

标签: python

是否可以在运行应用程序时更改python源文件并立即在应用程序中反映这些更改?

假设我有一个类Foo的foo.py文件。在其他模块中,我在用户操作上调用Foo上的函数。现在,我想在不重新启动应用程序的情况下更改Foo的源代码,并在下一个用户输入中查看新代码的结果。

这可能吗?

2 个答案:

答案 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