1

我编写了一系列 python 模块,它们保存在同一目录中,但遇到 ImportError 问题。

我使用的三个模块是draw_menu.py,errors.pyfile_operations.py.

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

file_operations.py我使用中定​​义的方法error.py来打印错误消息(例如,找不到文件等)。因此,我import errors在这里以同样的方式。

以上工作正常,但是当我开始使用draw_menu.pywhich 使用文件来定义 ascii 菜单中的选项(因此我正在使用import file_operations)时,遇到了 ImportError 。

ImportError: cannot import name file_operations

我知道这是因为如果您喜欢“导入树”的流程如下:

draw_menu<- file_operations<- errors<-file_operations

重要的是每个模块都可以单独使用,为什么这是一个问题,我如何在不删除import file_operations的情况下克服这个问题errors.py

谢谢

汤姆

4

3 回答 3

2

循环导入可能会导致 Python 出现问题(如您所料)。可能值得检查:

A)errors.py 和 file_operation.py 应该是单个模块(如果他们都非常依赖对方,他们需要分开吗?)

B)您可以延迟import一个或另一个模块。在调用函数之前,函数中的 import 语句不会运行,虽然在模块开头导入通常是一种很好的做法,但在 Python 中没有要求。在这种情况下,它可以避免导入期间的循环引用。

于 2010-07-13T09:24:28.267 回答
1

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

最好的解决方案是重构你的文件,这样你就不再有这种循环依赖了。如果这真的不可能,另一种解决方案是更改其中一个模块,以便有问题的导入发生在需要它的函数内部,而不是在顶层。这意味着模块的初始处理不依赖于导入,因此它会成功。

于 2010-07-13T09:25:07.787 回答
0

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

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

您可能会发现只需在实际需要使用它的时候导入 errors/file_operations 就可以缓解问题。这可能在函数内部。所以可能会在错误中包装对函数的调用:


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

这样,您只会在常规导入运行后导入错误。

于 2010-07-13T09:28:24.777 回答