[英]Why am I encountering an ImportError when I try to 're-import' a module?
我编写了一系列的python模块,这些模块保存在同一目录中,而ImportError遇到了麻烦。
我正在使用的三个模块是draw_menu.py
, errors.py
和file_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.