繁体   English   中英

尝试“重新导入”模块时,为什么会遇到ImportError?

[英]Why am I encountering an ImportError when I try to 're-import' a module?

我编写了一系列的python模块,这些模块保存在同一目录中,而ImportError遇到了麻烦。

我正在使用的三个模块是draw_menu.pyerrors.pyfile_operations.py

errors.py我需要一个错误代码列表,我使用在file_operations.py定义的自定义方法来打开一个包含该代码的文件,因此,我在she-bang下方(类定义上方)使用import file_operations

file_operations.py我使用error.py定义的方法来在出现错误(例如,找不到文件等)时显示错误消息。 因此,我在这里以相同的方式import errors

上面的工作正常,但是当我使用draw_menu.py ,该文件使用文件定义ascii菜单中的选项(因此我使用import file_operations ),遇到了ImportError。

ImportError: cannot import name file_operations

我了解这是因为如果您喜欢以下流程,则是“导入树”:

draw_menu < - file_operations < - errors < - file_operations

每个模块可以单独使用是很重要的,这是一个问题,为什么要解决这个问题而又不从errors.py删除import file_operations呢?

谢谢

汤姆

循环导入可能会在Python中引起问题(您可能会想到)。 可能值得检查是否:

A)errors.py和file_operation.py应该是单个模块(如果它们彼此非常依赖,是否需要分开?)

B)您可以延迟一个或另一个模块中的import 在函数调用之前,该函数中的import语句将不会运行,虽然通常将其导入模块的开头是一种好习惯,但在Python中并不需要。 在这种情况下,可以避免在导入过程中使用循环引用。

问题不是导入本身,而是依赖项 在导入errors之前无法处理file_operations ,但是在导入file_operations之前无法处理errors Python认为这是不可能的情况,并引发错误。

最好的解决方案是重构文件,以使您不再具有这种循环依赖关系。 如果这确实不可能,则替代解决方案是更改模块之一,以便有问题的导入发生在需要它的函数内,而不是在顶层。 这意味着模块的初始处理不依赖于导入,因此它将成功。

除了打破循环依赖之外,您还可以尝试移动导入调用的位置。 不要忘记,Python中的导入只是常规语句,因此您可以导入内部函数。

问题是导入(作为副作用)实际上将运行正在导入的模块(第一次调用导入)。 因此,如果您要导入一个模块,而该模块又导入了原始模块,那么事情会很混乱。

您可能会发现,只需在实际需要使用的位置导入错误/ file_operations,就可以缓解该问题。 这可以在函数内部。 因此,也许将对函数的调用包装在错误中:


def print_error_message(err):
    from errors import print_error_message as _print_error_message
    _print_error_message(err)

这样,仅在常规导入运行后才导入错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM