以下结构:
Utils.py:
def help(txt):
return txt + ' hi'
MyClass.py:
from FolderA import Utils
Class MyClass(object):
def TestMe():
Utils.help('me')
全部从start.py开始。
这给了我一个NameError,因为Utils
没有定义。
如果我将导入语句更改为from FolderA.Utils import help
和TestMe中的调用行help('me')
,我也得到一个NameError,因为没有定义帮助
如果我把导入INTO方法TestMe,它工作正常。
Class MyClass(object):
def TestMe():
from FolderA import Utils
Utils.help('me')
为什么文件顶部的常规导入不起作用?
答案 0 :(得分:0)
您的目录中需要一个空白的__init__.py
文件,以便将其作为包导入。像这样......
Folder A
- Utils.py
- __init__.py
FolderB
- MyClass.py
- __init__.py
start.py
答案 1 :(得分:0)
抱歉,我忘记在每个文件夹中提及 init .py文件。 这不是问题,否则导入IN功能就不会有效。
问题要好得多。
我无法发布原始代码,因为它复杂而且很多。所以我编写了你上面看到的例子。该示例没有问题。所以我尝试了一点,并解决了问题。
我从其他应用程序启动python脚本。因此,应用程序启动一个python控制台并保持此实例直到应用程序死亡。如果我通过应用程序启动python代码一次,在python中更改了一些代码并再次通过应用程序重新启动python代码,我看不出任何区别,因为python代码由python控制台缓存。因此,每次我在pys中进行更改时,我都必须关闭应用程序并重新启动它。因此我实现了重装机制。这显式删除并重新启动我给出的所有模块。(参数=模块)。 这个重新加载器在start.py中调用,所以我必须导入我需要的所有模块并在start.py中使用。然后重新加载器从缓存中删除它们(del sys.modules [name])并重新加载模块。 这就是问题所在。 通过这种机制,python执行以下操作。
因此导入模块并且在构建时没有看到错误,但是在运行时导入已经消失,因此没有定义任何内容。 通过将导入从文件顶部移动到using方法,在调用方法时重新导入,因此它再次起作用。
我不知道错误是由双重导入引起的(一个在start.py中,一个在py中真正需要导入)或重新加载机制,但我的解决方案现在可以正常工作。
解决方案: 我不在start.py中导入模块。我只是给重新加载器提供模块的名称,它现在只从sys.modules中删除它们。我没有重新进口,这只能通过以下方式完成。