将Python2翻译成Python3:“无法导入名称'wmldata'”

时间:2015-08-20 01:58:18

标签: python python-3.x

该项目简要介绍了以下结构:

/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'

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你似乎有一个循环依赖,这从来都不是一件好事。

此循环依赖项是导致此问题的原因,因为首次尝试从wmldata导入.时,它会找到行from . import wmlparser并尝试导入该模块,而在导入.wmldata

的过程

然后,当它尝试导入wmlparser时,会看到要从wmldata导入.的行,但.尚未导入,因此它不会其中有一个wmldata,这会导致问题。

解决此问题的方法是将from . import wmldata中的wmlparser行更改为 -

import wesnoth.wmldata as wmldata

并导入wmldata至 -

import wesnoth.wmlparser as wmlparser

这里最好的解决方法是摆脱这种循环依赖,因为可能还有其他问题,因为你没有包含完整的代码所以我看不到。比如,如果wmlparser正在使用wmldata中定义的某个名称/变量,那么它会抛出一个错误,该名称尚未定义,因为它尚未定义,当wmldata尝试时导入wmlparser