Python 为什么我在尝试';重新导入&x27;模块?

Python 为什么我在尝试';重新导入&x27;模块?,python,import,importerror,Python,Import,Importerror,我编写了一系列python模块,这些模块保存在同一个目录中,我遇到了导入问题 我使用的三个模块是draw\u menu.py、errors.py和file\u operations.py 在errors.py中,我需要一个错误代码列表,我正在使用file\u operations.py中定义的自定义方法打开一个包含代码的文件,因此我在she bang下方(类定义上方)使用import file\u operations 在file_operations.py中,我使用error.py中定义的方法

我编写了一系列python模块,这些模块保存在同一个目录中,我遇到了导入问题

我使用的三个模块是
draw\u menu.py
errors.py
file\u operations.py

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

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

上面的操作很好,但是当我使用
draw\u menu.py
时,它使用一个文件来定义ascii菜单中的选项(因此我使用的是
import file\u操作
),会遇到ImportError

ImportError:无法导入名称文件\u操作

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


draw\u菜单
循环导入可能会导致Python出现问题(正如您所预料的那样)。如果:

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


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

问题不在于导入本身,而在于依赖关系<代码>文件操作
在导入
错误
之前无法处理,但是
错误
在导入
文件操作
之前无法处理。Python认为这是不可能的情况,并引发了一个错误


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

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

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

您可能会发现,只需在实际需要使用时导入错误/文件\u操作,就可以缓解问题。这可能在函数内部。因此,可能会将对函数的调用包装为错误:


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

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

这是不正确的。在导入过程完成到足以定义其他模块中的引用之前,无法使用其他模块中的引用,但简单地导入模块并不是问题。感谢您的快速响应,我将两个模块分开,并在
errors.py
中定义的所需方法内移动
导入文件\u操作
,这解决了我的问题。循环导入通常会产生什么样的问题?@Thorsley:at上有一篇关于用python导入的很老但很好的文章,其中有一节是关于循环导入的。非常值得一读。或者您可以在顶部导入错误,然后在函数中使用错误。打印错误消息。