2

我们有一个名为 model 的包

在模型中,我们有一个 TopicM 模块,它定义了一个类 Topic 我们将它导入到同一个包中名为 GeneralM 的模块中。有时(很少)我们会收到此错误:

可能是什么原因?会不会是循环进口?我们是否应该把一些东西放进去'__init__.py'?

请指教。

(我为冗长的错误道歉)-->-->-->

<type 'exceptions.ImportError'> Python 2.7.2: C:\Python27\pythonw.exe
Fri Jun 08 11:23:46 2012

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in _HandleRequest(self=<google.appengine.tools.dev_appserver.DevAppServerRequestHandler instance>)
   2779         outfile = cStringIO.StringIO()
   2780         try:
=> 2781           self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
   2782         finally:
   2783           self.module_manager.UpdateModuleFileModificationTimes()
self = <google.appengine.tools.dev_appserver.DevAppServerRequestHandler instance>, self._Dispatch = <bound method DevAppServerRequestHandler._Dispat...v_appserver.DevAppServerRequestHandler instance>>, dispatcher = <google.appengine.tools.dev_appserver.MatcherDispatcher object>, self.rfile = <socket._fileobject object>, outfile = <cStringIO.StringO object>, env_dict = {'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'CURRENT_VERSION_ID': '1.1', 'REMOTE_ADDR': '127.0.0.1', 'REQUEST_ID_HASH': 'F1F836CB', 'REQUEST_METHOD': 'GET', 'SDK_VERSION': '1.6.5', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '8080', 'SERVER_PROTOCOL': 'HTTP/1.0', ...}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in _Dispatch(self=<google.appengine.tools.dev_appserver.DevAppServerRequestHandler instance>, dispatcher=<google.appengine.tools.dev_appserver.MatcherDispatcher object>, socket_infile=<socket._fileobject object>, outfile=<cStringIO.StringO object>, env_dict={'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'CURRENT_VERSION_ID': '1.1', 'REMOTE_ADDR': '127.0.0.1', 'REQUEST_ID_HASH': 'F1F836CB', 'REQUEST_METHOD': 'GET', 'SDK_VERSION': '1.6.5', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '8080', 'SERVER_PROTOCOL': 'HTTP/1.0', ...})
   2667           dispatcher.Dispatch(app_server_request,
   2668                               outfile,
=> 2669                               base_env_dict=env_dict)
   2670         finally:
   2671           request_file.close()
base_env_dict undefined, env_dict = {'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'CURRENT_VERSION_ID': '1.1', 'REMOTE_ADDR': '127.0.0.1', 'REQUEST_ID_HASH': 'F1F836CB', 'REQUEST_METHOD': 'GET', 'SDK_VERSION': '1.6.5', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '8080', 'SERVER_PROTOCOL': 'HTTP/1.0', ...}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in Dispatch(self=<google.appengine.tools.dev_appserver.MatcherDispatcher object>, request=<AppServerRequest relative_url: /prof?lectureKey...mp', mode 'rb' at 0x0384A860> force_admin: False>, outfile=<cStringIO.StringO object>, base_env_dict={'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'CURRENT_VERSION_ID': '1.1', 'REMOTE_ADDR': '127.0.0.1', 'REQUEST_ID_HASH': 'F1F836CB', 'REQUEST_METHOD': 'GET', 'SDK_VERSION': '1.6.5', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '8080', 'SERVER_PROTOCOL': 'HTTP/1.0', ...})
    690         forward_request = dispatcher.Dispatch(request,
    691                                               outfile,
=>  692                                               base_env_dict=base_env_dict)
    693 
    694         if forward_request:
base_env_dict = {'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'CURRENT_VERSION_ID': '1.1', 'REMOTE_ADDR': '127.0.0.1', 'REQUEST_ID_HASH': 'F1F836CB', 'REQUEST_METHOD': 'GET', 'SDK_VERSION': '1.6.5', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '8080', 'SERVER_PROTOCOL': 'HTTP/1.0', ...}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in Dispatch(self=<google.appengine.tools.dev_appserver.CGIDispatcher object>, request=<AppServerRequest relative_url: /prof?lectureKey...mp', mode 'rb' at 0x0384A860> force_admin: False>, outfile=<cStringIO.StringO object>, base_env_dict={'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'CURRENT_VERSION_ID': '1.1', 'REMOTE_ADDR': '127.0.0.1', 'REQUEST_ID_HASH': 'F1F836CB', 'REQUEST_METHOD': 'GET', 'SDK_VERSION': '1.6.5', 'SERVER_NAME': 'localhost', 'SERVER_PORT': '8080', 'SERVER_PROTOCOL': 'HTTP/1.0', ...})
   1729                      memory_file,
   1730                      outfile,
=> 1731                      self._module_dict)
   1732     finally:
   1733       logging.root.level = before_level
self = <google.appengine.tools.dev_appserver.CGIDispatcher object>, self._module_dict = {'Cookie': <module 'Cookie' from 'C:\Python27\lib\Cookie.pyc'>, 'StringIO': <module 'StringIO' from 'C:\Python27\lib\StringIO.pyc'>, 'UserDict': <module 'UserDict' from 'C:\Python27\lib\UserDict.pyc'>, '__builtin__': <module '__builtin__' (built-in)>, '__future__': <module '__future__' from 'C:\Python27\lib\__future__.pyc'>, '__main__': <module 'prof' from 'C:\Current Project\study-wise\src\prof.py'>, '_abcoll': <module '_abcoll' from 'C:\Python27\lib\_abcoll.pyc'>, '_bisect': <module '_bisect' (built-in)>, '_collections': <module '_collections' (built-in)>, '_functools': <module '_functools' (built-in)>, ...}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in ExecuteCGI(config=<AppInfoExternal error_handlers=None b...one api_version=1 api_config=None >, root_path=r'C:\Current Project\study-wise\src', handler_path='prof.py', cgi_path=r'C:\Current Project\study-wise\src\prof.py', env={'APPENGINE_RUNTIME': 'python', 'APPLICATION_ID': 'dev~greatest-app-ever', 'AUTH_DOMAIN': 'gmail.com', 'CONTENT_LENGTH': '', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'CURRENT_VERSION_ID': '1.1', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'HTTP_CACHE_CONTROL': 'max-age=0', ...}, infile=<cStringIO.StringO object>, outfile=<cStringIO.StringO object>, module_dict={'Cookie': <module 'Cookie' from 'C:\Python27\lib\Cookie.pyc'>, 'StringIO': <module 'StringIO' from 'C:\Python27\lib\StringIO.pyc'>, 'UserDict': <module 'UserDict' from 'C:\Python27\lib\UserDict.pyc'>, '__builtin__': <module '__builtin__' (built-in)>, '__future__': <module '__future__' from 'C:\Python27\lib\__future__.pyc'>, '__main__': <module 'prof' from 'C:\Current Project\study-wise\src\prof.py'>, '_abcoll': <module '_abcoll' from 'C:\Python27\lib\_abcoll.pyc'>, '_bisect': <module '_bisect' (built-in)>, '_collections': <module '_collections' (built-in)>, '_functools': <module '_functools' (built-in)>, ...}, exec_script=<function ExecuteOrImportScript>, exec_py27_handler=<function ExecutePy27Handler>)
   1629         reset_modules = exec_py27_handler(config, handler_path, cgi_path, hook)
   1630       else:
=> 1631         reset_modules = exec_script(config, handler_path, cgi_path, hook)
   1632     except SystemExit, e:
   1633       logging.debug('CGI exited with status: %s', e)
reset_modules = True, exec_script = <function ExecuteOrImportScript>, config = <AppInfoExternal error_handlers=None b...one api_version=1 api_config=None >, handler_path = 'prof.py', cgi_path = r'C:\Current Project\study-wise\src\prof.py', hook = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py in ExecuteOrImportScript(config=<AppInfoExternal error_handlers=None b...one api_version=1 api_config=None >, handler_path='prof.py', cgi_path=r'C:\Current Project\study-wise\src\prof.py', import_hook=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>)
   1317 
   1318     if module_code:
=> 1319       exec module_code in script_module.__dict__
   1320     else:
   1321       script_module.main()
module_code = <code object <module> at 03760E78, file "C:\Current Project\study-wise\src\prof.py", line 2>, script_module = <module 'prof' from 'C:\Current Project\study-wise\src\prof.py'>, script_module.__dict__ = {'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>, 'AssertionError': <type 'exceptions.AssertionError'>, 'AttributeError': <type 'exceptions.AttributeError'>, 'BaseException': <type 'exceptions.BaseException'>, 'BufferError': <type 'exceptions.BufferError'>, 'BytesWarning': <type 'exceptions.BytesWarning'>, 'DeprecationWarning': <type 'exceptions.DeprecationWarning'>, 'EOFError': <type 'exceptions.EOFError'>, 'Ellipsis': Ellipsis, 'EnvironmentError': <type 'exceptions.EnvironmentError'>, ...}, '__doc__': None, '__file__': r'C:\Current Project\study-wise\src\prof.py', '__loader__': <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, '__name__': 'prof', '__package__': None, 'run_wsgi_app': <function run_wsgi_app>, 'template': <module 'google.appengine.ext.webapp.template' f...engine\google\appengine\ext\webapp\template.pyc'>, 'webapp': <module 'google.appengine.ext.webapp' from 'D:\P...engine\google\appengine\ext\webapp\__init__.pyc'>}
 C:\Current Project\study-wise\src\prof.py in ()
      3 from google.appengine.ext.webapp.util import run_wsgi_app
      4 from google.appengine.ext.webapp import template
=>    5 from model import TopicM
      6 from model import LectureM
      7 from model import GeneralM
model undefined, TopicM undefined
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in Decorate(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, *args=('model.TopicM',), **kwargs={})
    674     self._indent_level += 1
    675     try:
=>  676       return func(self, *args, **kwargs)
    677     finally:
    678       self._indent_level -= 1
func = <function load_module>, self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, args = ('model.TopicM',), kwargs = {}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in load_module(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, fullname='model.TopicM')
   1856         search_path = parent_module.__path__
   1857 
=> 1858     return self.FindAndLoadModule(submodule, fullname, search_path)
   1859 
   1860   @Trace
self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, self.FindAndLoadModule = <bound method HardenedModulesHook.Decorate of <g...ppserver_import_hook.HardenedModulesHook object>>, submodule = 'TopicM', fullname = 'model.TopicM', search_path = [r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model']
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in Decorate(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, *args=('TopicM', 'model.TopicM', [r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model']), **kwargs={})
    674     self._indent_level += 1
    675     try:
=>  676       return func(self, *args, **kwargs)
    677     finally:
    678       self._indent_level -= 1
func = <function FindAndLoadModule>, self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, args = ('TopicM', 'model.TopicM', [r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model']), kwargs = {}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in FindAndLoadModule(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, submodule='TopicM', submodule_fullname='model.TopicM', search_path=[r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model'])
   1720                                          source_file,
   1721                                          pathname,
=> 1722                                          description)
   1723 
   1724 
description = ('.py', 'U', 1)
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in Decorate(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, *args=('model.TopicM', <closed file 'C:\Current Project\study-wise\src\model\TopicM.py', mode 'U'>, r'C:\Current Project\study-wise\src\model\TopicM.py', ('.py', 'U', 1)), **kwargs={})
    674     self._indent_level += 1
    675     try:
=>  676       return func(self, *args, **kwargs)
    677     finally:
    678       self._indent_level -= 1
func = <function LoadModuleRestricted>, self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, args = ('model.TopicM', <closed file 'C:\Current Project\study-wise\src\model\TopicM.py', mode 'U'>, r'C:\Current Project\study-wise\src\model\TopicM.py', ('.py', 'U', 1)), kwargs = {}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in LoadModuleRestricted(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, submodule_fullname='model.TopicM', source_file=<closed file 'C:\Current Project\study-wise\src\model\TopicM.py', mode 'U'>, pathname=r'C:\Current Project\study-wise\src\model\TopicM.py', description=('.py', 'U', 1))
   1663                                      source_file,
   1664                                      pathname,
=> 1665                                      description)
   1666       except:
   1667 
description = ('.py', 'U', 1)
 C:\Current Project\study-wise\src\model\TopicM.py in ()
      2 from google.appengine.ext import db
=>    3 import GeneralM
      4 import LectureM
      5 
      6 def getTopicsByLecture(lecture):
GeneralM undefined
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in Decorate(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, *args=('model.GeneralM',), **kwargs={})
    674     self._indent_level += 1
    675     try:
=>  676       return func(self, *args, **kwargs)
    677     finally:
    678       self._indent_level -= 1
func = <function load_module>, self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, args = ('model.GeneralM',), kwargs = {}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in load_module(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, fullname='model.GeneralM')
   1856         search_path = parent_module.__path__
   1857 
=> 1858     return self.FindAndLoadModule(submodule, fullname, search_path)
   1859 
   1860   @Trace
self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, self.FindAndLoadModule = <bound method HardenedModulesHook.Decorate of <g...ppserver_import_hook.HardenedModulesHook object>>, submodule = 'GeneralM', fullname = 'model.GeneralM', search_path = [r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model']
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in Decorate(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, *args=('GeneralM', 'model.GeneralM', [r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model']), **kwargs={})
    674     self._indent_level += 1
    675     try:
=>  676       return func(self, *args, **kwargs)
    677     finally:
    678       self._indent_level -= 1
func = <function FindAndLoadModule>, self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, args = ('GeneralM', 'model.GeneralM', [r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model']), kwargs = {}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in FindAndLoadModule(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, submodule='GeneralM', submodule_fullname='model.GeneralM', search_path=[r'C:\Current Project\study-wise\src\model', r'C:\Current Project\study-wise\src\model'])
   1720                                          source_file,
   1721                                          pathname,
=> 1722                                          description)
   1723 
   1724 
description = ('.py', 'U', 1)
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in Decorate(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, *args=('model.GeneralM', <closed file 'C:\Current Project\study-wise\src\model\GeneralM.py', mode 'U'>, r'C:\Current Project\study-wise\src\model\GeneralM.py', ('.py', 'U', 1)), **kwargs={})
    674     self._indent_level += 1
    675     try:
=>  676       return func(self, *args, **kwargs)
    677     finally:
    678       self._indent_level -= 1
func = <function LoadModuleRestricted>, self = <google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, args = ('model.GeneralM', <closed file 'C:\Current Project\study-wise\src\model\GeneralM.py', mode 'U'>, r'C:\Current Project\study-wise\src\model\GeneralM.py', ('.py', 'U', 1)), kwargs = {}
 D:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py in LoadModuleRestricted(self=<google.appengine.tools.dev_appserver_import_hook.HardenedModulesHook object>, submodule_fullname='model.GeneralM', source_file=<closed file 'C:\Current Project\study-wise\src\model\GeneralM.py', mode 'U'>, pathname=r'C:\Current Project\study-wise\src\model\GeneralM.py', description=('.py', 'U', 1))
   1663                                      source_file,
   1664                                      pathname,
=> 1665                                      description)
   1666       except:
   1667 
description = ('.py', 'U', 1)
 C:\Current Project\study-wise\src\model\GeneralM.py in ()
      2 from google.appengine.ext import db
      3 from google.appengine.api import users
=>    4 from TopicM import Topic
      5 from LectureM import Lecture
      6 
TopicM undefined, Topic undefined

<type 'exceptions.ImportError'>: cannot import name Topic
      args = ('cannot import name Topic',)
      message = 'cannot import name Topic' 
4

3 回答 3

3

看到Pythonic 方式来解决循环导入语句?. 基于此,将 GeneralM 中的导入从更改from TopicM import Topic为 just import TopicM,然后将引用限定为Topicas TopicM.Topic

于 2012-06-08T12:07:56.170 回答
1

尝试将所有可能的导入移动到模块的底部,如果您正确规划了类关系,那应该可以解决您的问题!

如果您的问题拒绝消失,请阅读这个很棒的答案: https ://stackoverflow.com/a/894885/988434

玩得开心黑客!

于 2012-06-09T01:42:36.877 回答
0
from model.TopicM import Topic

试试看。

于 2012-06-08T12:07:07.417 回答