【问题标题】:Reloading a function within a module重新加载模块中的函数
【发布时间】:2018-06-10 19:32:06
【问题描述】:

目标

我想从解释器中导入一个自定义模块,运行它,修改它,重新加载它,然后再次运行它以查看更改。

背景

我正在使用 python 2.7。在开始编写自己的模块之前,我充分利用了 python 2.7 中的 reload() 函数。

我用一个简单的例子重现了我的问题

  • 我创建了一个文件夹,名为:demo
  • demo内部,我放置了两个文件:__init__.pyplotme.py

我的__init__.py 文件包含:

from .plotme import plot

我的 plotme.py 文件包含:

import matplotlib.pyplot as plt
import numpy as np

def plot():
    x=np.linspace(0,np.pi*4,1000)
    y=np.cos(x)
    plt.plot(x,y,'b')

我用命令运行它:

>>> import demo
>>> demo.plot()

它工作得很好。

接下来,我决定我希望情节是红色的,而不是蓝色的。我在 plotme.py 中将'b' 修改为'r' 并保存。然后我输入:

>>> import(demo)
>>> demo.plot()

情节仍然是蓝色的,而不是红色的。不是我想要的。相反,我尝试:

>>> reload(demo)
>>> demo.plot()

再一次,颜色没有更新。

我认为\__init__.py 中需要有一个重新加载命令。我尝试将其更新为:

from .plotme import plot
reload(plot)

当我输入时:

>>> reload(demo)

我得到错误:

TypeError: reload() argument must be module

我改为尝试使用reload(.plotme) 重新加载。同样的错误。当我尝试reload(plotme) 时,它不会抛出错误,但绘图的颜色不会更新为红色。

我该如何解决这个问题?

我不希望每次修改几行代码时都必须关闭并重新启动解释器。

【问题讨论】:

  • 但我的问题是为什么您不将颜色作为参数添加到plot() 函数?这样您就可以随心所欲地通过那里?
  • 对于您的问题,您需要在reload(...) 之后再次导入模块。阅读python refresh/reload
  • 对于这个简单的例子,我可以这样做。但是,如果我决定让“plot()”函数编写文本而不是绘图,那将是完全不同的事情。
  • @MoinuddinQuadri 我不是 100% 关注的。请您提供确切的代码供我尝试吗?谢谢。
  • @MoinuddinQuadri 我将\__init__.py 更改为from .plotme import plot reload(plotme) from .plotme import plot,它似乎正在工作。谢谢!虽然它确实有效,但有没有更好的方法来做到这一点? (向 cmets 添加代码时遇到问题...)

标签: python python-2.7 python-import python-module


【解决方案1】:

根据@MoinuddinQuadri 的建议,我更新了我的__init__.py 文件以包含:

from .plotme import plot
reload(plot)
from .plotme import plot

它有效。这有点麻烦,因为我的最终应用程序将有很多独立的函数要加载,但它可以工作。谢谢,MoinuddinQuadri。

还有人有其他建议吗?如果我有 20 个函数,写出来 20 次有点乏味。有没有办法快速重新加载所有功能?

【讨论】:

    【解决方案2】:

    你必须重新加载demo模块(即文件demo/__init__.py) **and** the filedemo/plotme.pywhich isdemo.plotme. More precisely, as you importplotfunction from theplotmesub module, you must import firstplotmeand thendemo`:

    reload(demo.plotme)
    reload(demo)
    

    在这两个命令之后,plotme 中的任何更改都会被考虑在内。

    【讨论】:

    • 另一个好的解决方案,谢谢!我认为这肯定更接近于我正在寻找的内容,但如果我有 20 个要定期修改的文件,这似乎仍然很麻烦。
    【解决方案3】:

    相关:

    How do I unload (reload) a Python module?
    Why are there dummy modules in sys.modules?

    我的回答:

    import sys
    for n in filter(lambda x: x.startswith('demo') and x != 'demo', sys.modules):
        del(sys.modules[n])
    reload(demo)
    

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2011-11-08
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2023-03-21
      • 2019-03-14
      相关资源
      最近更新 更多