项目结构如下:
/wmlvalidator.py
/wesnoth/__init__.py
/wesnoth/wmlgrammar.py
/wesnoth/wmlparser.py
/wesnoth/wmldata.py
在/wmlvalidator.py
脚本中,我有:
import wesnoth.wmldata as wmldata
import wesnoth.wmlparser as wmlparser
import wesnoth.wmlgrammar as wmlgrammar
/wesnoth/wmlgrammar.py
脚本只导入Python标准库。
脚本/wesnoth/wmlparser.py
有:
import os, glob, sys
from . import wmldata
import re
脚本/wesnoth/wmldata.py
有:
import re, sys
from . import wmlparser
import codecs
脚本/wesnoth/__init__.py
为空。
当我运行/wmlvalidator.py
时,我得到以下错误信息:回溯(最近一次调用):
File "/home/macabeus/ApenasMeu/pycharm/helpers/pydev/pydevd.py", line 2357, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "/home/macabeus/ApenasMeu/pycharm/helpers/pydev/pydevd.py", line 1777, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/home/macabeus/ApenasMeu/pycharm/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"n", file, 'exec'), glob, loc)
File "/home/macabeus/ApenasMeu/wesnoth/data/tools/wmlvalidator", line 10, in <module>
import wesnoth.wmldata as wmldata
File "/home/macabeus/ApenasMeu/wesnoth/data/tools/wesnoth/wmldata.py", line 19, in <module>
from . import wmlparser
File "/home/macabeus/ApenasMeu/wesnoth/data/tools/wesnoth/wmlparser.py", line 4, in <module>
from . import wmldata
ImportError: cannot import name 'wmldata'
如何解决这个问题?
你似乎有一个循环依赖,这从来都不是一件好事。
这个循环依赖是导致问题的原因,因为首先当您尝试从.
导入wmldata
时,它会找到from . import wmlparser
行并尝试导入该模块,而在导入.
和wmldata
的过程中。
然后当它试图导入wmlparser
时,它看到要从.
导入wmldata
的行,但.
尚未导入,因此它还没有wmldata
,这导致了问题。
wmlparser
中的from . import wmldata
行改为-
import wesnoth.wmldata as wmldata
在wmldata
中导入到-
import wesnoth.wmlparser as wmlparser
这里最好的修复是摆脱这个循环依赖,因为可能会有其他问题由此产生,我不能看到,因为你没有包括完整的代码。例如,如果wmlparser
正在使用wmldata
中定义的一些名称/变量,当wmldata
试图导入wmlparser
时,它将抛出一个错误,认为该名称尚未定义,因为它尚未定义。