在循环内导入模块

6

我有一个文件,叫做foo.py。它会做一些事情,包括通过串行端口发送一些数据,并发送返回的响应。

我还有另一个文件,看起来像这样:

iteration = 0
while True:
    iteration += 1
    // do some stuff here every time
    if iteration%5 == 0:
        import foo
    time.sleep (100)

我知道在独立计数器的优雅性(或缺乏)方面存在一些更广泛的问题,但是暂时搁置这个问题——串行传输/电子邮件只在第一次触发时起作用。在倍数为5的后续循环中(将触发模数5 == 0),什么也不会发生。
我的foo.py导入版本是否被缓存,并避免在后续运行中触发?如果是,我如何从循环脚本内重复调用该代码?我应该将其直接嵌入吗?
感谢任何提示!

3
你能解释一下为什么你想要导入它超过一次吗? - James Oravec
4
将代码从foo中移到一个函数中,在文件开头导入相关模块,然后调用foo.name_of_function() - NightShadeQueen
感谢您的问题VenomFangs。NightShadeQueen是正确的 - 这只是一段我想要多次重新执行的代码块。将其放在一个函数中更有意义。 - penitent_tangent
2个回答

7

如果你可以访问foo.py,你应该将想要运行的任何内容都包装在一个函数中。然后,在循环中只需导入一次foo并调用函数foo.func()

请参见这里,了解为什么重复导入不会运行文件中的代码的解释。


当然 - 这很有道理。谢谢! - penitent_tangent

2

您可以将import foo替换为

if 'foo' in dir(): # if it has already been imported
    reload(foo)
else:
    import foo

我不是很确定,但这应该可以解决问题。 编辑:现在我确定了。


2
是的,它应该可以工作,但是请不要这样做。reload()函数真正只应在开发期间使用,当您在交互式解释器中工作并且需要重新加载已修改的模块时。请参阅reload()文档。请注意,在Python 3中,reload()不是内置函数,您必须从impimportlib导入它。 - PM 2Ring
@PM2Ring 是的,你说得对,但我认为问题提出者其实已经意识到了这一点。 - koffein
太好了,谢谢。我不知道这是一个选项,现在知道了,也很好 :) - penitent_tangent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接