将 Python2 转换为 Python3:"Cannot import name 'wmldata'"



项目结构如下:

/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时,它将抛出一个错误,认为该名称尚未定义,因为它尚未定义。

相关内容

最新更新