Python导入函数到类

时间:2015-08-12 15:01:43

标签: python class import module

以下结构:

  • FolderA
    • Utils.py
  • FolderB中
    • MyClass.py
  • start.py

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')

为什么文件顶部的常规导入不起作用?

2 个答案:

答案 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执行以下操作。

  • 随后加载所有导入。
  • main()已启动。
  • main()调用重新加载器。
  • 重新加载器从其缓存中删除所有模块。

因此导入模块并且在构建时没有看到错误,但是在运行时导入已经消失,因此没有定义任何内容。 通过将导入从文件顶部移动到using方法,在调用方法时重新导入,因此它再次起作用。

我不知道错误是由双重导入引起的(一个在start.py中,一个在py中真正需要导入)或重新加载机制,但我的解决方案现在可以正常工作。

解决方案: 我不在start.py中导入模块。我只是给重新加载器提供模块的名称,它现在只从sys.modules中删除它们。我没有重新进口,这只能通过以下方式完成。