我有一个Python模块测试,我想编辑测试并在解释器上运行一些测试功能。Python是否会在不重新导入的情况下自动查看我在测试中编辑的功能的差异?这个动作的合适词是什么?
编辑到目前为止,没有任何内容在起作用,因此我将发布更多详细信息:
我的模块中有一个类,称为Test。所以我用了这个说法from test import Test。现在,当我尝试命令时reload(test),解释器告诉我重载是未定义的。如果我这样做,import imp那么imp.reload(test)解释器会告诉我这test是未定义的。这是怎么了?
我正在module使用python的unittest框架为python模块编写单元测试.
该模块在加载时使用json文件进行一些"预处理",因此它具有以下内容:
 module.info['xyz']可以访问和使用它.
在为此编写测试时,我想在每次测试之前重新加载模块,以便module.info在开始当前测试之前,对于每个测试,字典的旧键不再存在.
现在我有一个reload(module)在setUp()但这似乎并没有做的伎俩.我有罗纳尔多,也很想通过引进旧密钥test_A在其他测试,如test_B和test_C那些后执行.
我想知道是否有办法实现我想要实现的目标,或者您是否可以指出我的文档说它无法完成.
我希望代码更改在开发过程中立即生效.如何在运行的Python(2.7)应用程序中检测更改的文件并重新加载它们?
编辑:
阅读'Ivo van der Wijk'链接的页面后,我认为最好在代码更改时重新启动Web应用程序 - 就像Django那样.所以实际的问题是:如何监控文件修改?
可能重复:
如何卸载(重新加载)Python 模块?
是否可以在 python 中“刷新”导入的模块?用例:交互式改进模块;到目前为止,我总是完全重新启动交互式会话以重新加载更新的源。
有没有更好的办法?
场景:一个模块化的应用程序,可以在运行时动态加载.py模块.程序员(我)希望编辑模块的代码,然后将其重新加载到程序中而不停止执行.
可以这样做吗?
我已尝试在更新的module.py上第二次运行导入,但未获取更改
我对python相对较新(已经做了一些1h脚本,比如一个小小的网络服务器或本地网络聊天),并想在其中编写一个插件管理器.我的想法是,有一个插件接口,具有以下功能:
getDependencies -> all dependencies of the plugin to other plugins
getFunctions -> all functions that this plugin introduces
initialize -> a function that is called when loading the plugin
(我可以想象在依赖关系上有一个拓扑排序算法来决定插件初始化的顺序.)
我想实现多线程,这意味着每个插件都在自己的线程中运行,该线程有一个可以串行执行的函数调用工作队列.当一个插件调用另一个插件的函数时,它会调用管理器,而管理器又会将函数调用插入到另一个插件的队列中.
此外,管理者应该提供某种事件系统,其中插件可以注册他们自己的事件并成为其他人的事件的听众.
此外,我希望能够在代码更改或其线程崩溃时重新加载插件,而无需关闭管理器/应用程序.我已经阅读了如何卸载(重新加载)Python模块?与此同时.
再次说清楚:管理员不应该提供任何其他功能,而不是支持其插件与彼此之间的通用通信接口,并行运行的能力(以多线程方式,而不需要插件知道这一点)并恢复更新/崩溃的插件.
所以我的问题是:是否可以在python中执行此操作?如果是,那么粗略草图中是否存在设计错误?我很感激对此有任何好的建议.
其他"文献": 用Python实现插件系统
给定以下两个.py文件:
aclass.py
class A(object):
    pass
main.py
def importer(klass):
    """
    Used to import classes from there python qalname
    """
    import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
    klass = klass.split('.')
    module = '.'.join(klass[:-1])
    klass = klass[-1]
    return import_(module, klass)
from aclass import A
import_A = importer('aclass.A')
print isinstance(A(), import_A)  # Expected to be true 
print isinstance(import_A(), A)  # Expected to be true 
在此阶段,一切正常(我的程序打印True\nTrue),但是如果我修改importer方法以强制重新加载,即:
这行:
    import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
替换为:
    import_ = lambda m, …我有一个在 Jupyter Lab 中运行的 ipython 笔记本。它正在运行一个函数,该函数使用我创建的名为“Myfile.py”的外部模块中的变量。
Myfile.py 包括一些最初定义的变量,如下所示:
Myterms = ['honda accord', 'ferrari', 'mazerati', 'dodge dumpster']
我对中的Myterms列表进行了一些编辑Myfile.py,然后将更改保存到文件中。
Myterms = ['Nissan Leaf', 'Tesla Roadster']
我想要做的是将Myterms列表重新加载Myfile.py到笔记本中,这样当我调用列表中的变量时,它们会反映所做的更改。
我一直在使用此示例中的代码版本:
import myfile
import importlib
def reloader(myfile):
    importlib.reload(myfile)
    from myfile import Myterms
reloader(myfile)
print(Myterms)
但该行print(myterms)仍然打印出来
['honda accord', 'ferrari', 'mazerati', 'dodge dumpster']
更新:出于某种原因,旧Myterms列表似乎在内存中徘徊,尽管具有该importlib.reload功能,但并未被覆盖。在做了更多研究之后,这个答案可能会提供一些关于原因的线索,但我找不到解决方法。
python ipython python-importlib jupyter-notebook jupyter-lab
我正在python解释器中测试代码并在单独的窗口中进行编辑.每当我对我正在测试的模块进行更改时,我当前需要重新启动python.
有更简单的方法吗?
谢谢,
查理
python ×10
reload ×4
import ×3
module ×2
hotdeploy ×1
hotswap ×1
interactive ×1
ipython ×1
isinstance ×1
iteration ×1
jupyter-lab ×1
modular ×1
plugins ×1
python-3.x ×1
testing ×1