程序:当我在主程序中动态修改导入的类文件时,似乎正在运行旧的.pyc

时间:2013-03-29 05:12:09

标签: python

我正在尝试修改类运行时,它在我的主程序中导入并再次运行时。我正在导入同一个类,但这次它运行我的旧功能(在修改类之前)

def mydef()
{
  from myclassfile import myclass
  ---------
  ---------
}

def mydef2()
{
  from myclassfile import myclass
  ---------
  ---------
  here, Modifying class by changing code in myclassfile 
}

def mydef3()
{
  from myclassfile import myclass
  ---------
  ---------
  getting old functionality [before modification of class] 
}

如果我按以下顺序调用class def:

mydef()
mydef2()
mydef3()

在mydef3()中获取旧功能

我知道我认为它是python的速度优化部分所以它阻止再次编译同一个类并导入它,但它应该编译,因为类已被修改。

请帮帮我吗?

2 个答案:

答案 0 :(得分:1)

在单个解释器会话中,import仅导入一次模块,即使源文件已被修改。模块对象在首次导入时存储在sys.modules字典中,所有后续导入都使用该对象。您可以使用reload()重新加载模块,但修改源文件可能是实现您想要做的最难的方法。如果你发布更多关于你的实际目标的信息(例如,为什么你认为你需要修改磁盘上的源文件并重新导入它),有人可能会建议更好的方法。

答案 1 :(得分:0)

您可能希望查看子类MyClass而不是修改它。其他代码可能正在使用MyClass,可能不知道您的修改。

例如,

mymodule.py:

class MyClass(object):
    def do_something(self):
        return 'Foo'

modified.py:

from mymodule import MyClass


class ModifiedClass(MyClass):
    def do_something(self):
        original = super(ModifiedClass, self).do_something()
        return original * 2


def main():
    mycls = MyClass()
    modcls = ModifiedClass()

    print mycls.do_something()
    print modcls.do_something()


if __name__ == '__main__':
    main()

输出:

$ python modified.py
Foo
FooFoo