2012-07-13 55 views
1

我卡住进口,不知道如何解决这个问题。Python设计 - 跨进口

我有3个模块:

  1. test_project.py
  2. modules/__init__.py
  3. r.py
  4. module.py
  5. module_configuration.py

的依赖新生列表否认:

test_project.py IMPORTS modules/__init__.py 
modules/__init__.py IMPORTS r.py 
r.py IMPORTS > module_configuration.py 
module_configuration.py IMPORTS > modules/__init__.py 

因此,您可以看到,我们在此处有一个循环导入。

  • modules/__init__.py保留类定义的字典(像R类)。
  • R类可以在其构造
  • ModuleConfiguration需要从modules/__init__.py类字典ModuleConfiguration的实例。

错误消息我得到:

ERROR: controller.test_project (unittest.loader.ModuleImportFailure) 
---------------------------------------------------------------------- 
ImportError: Failed to import test module: controller.test_project 
Traceback (most recent call last): 
File "/usr/lib/python2.7/unittest/loader.py", line 252, in _find_tests 
module = self._get_module_from_name(name) 
File "/usr/lib/python2.7/unittest/loader.py", line 230, in 
_get_module_from_name__import__(name) 
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/controller/test_project.py",  
line 9, in <module> 
from c.core.modules import MODULES 
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/modules/__init__.py", line 5, in <module> 
from R import R 
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/modules/R.py", line 6, in <module> 
from c.core.module import Module 
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/module.py", line 13, in <module> 
from c.core.module_configuration import ModuleConfiguration 
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/module_configuration.py", line 7, in <module> 
from c.core.modules import MODULES 

ImportError: cannot import name MODULES 

如何解决它的任何想法?

+1

那么...这是一个问题呢? – 2012-07-13 13:21:55

回答

1

不是在模块加载时创建实例,而是实现返回相关结果的函数,并将这些函数保留在它们各自的模块中。然后,一旦模块被加载,所有东西都可以使用。 从moduleB从moduleB和moduleB导入moduleA没有任何问题。 您是否需要必须在模块加载时创建的模块全局对象?这通常是不需要的。相反,尝试构建全部模块就位后首次使用时需要的全局模块。

+0

我在说的字典只保留类名,而不是实例。我需要它,因为我通过这个列表GUI和GUI使组合框选择项目,每个项目都有它自己的类。这就是为什么我需要类名和'key'之间的链接。 – 2012-07-13 13:51:01

+1

只需让每个模块首先加载其需要的其他模块,然后在需要的模块末尾调用该方法来设置这些类的列表。你面对的确切问题是什么? – 2012-07-13 13:53:11

+0

用这些类名设置字典我实际上需要它导入。但我想我知道你的意思,我可以在模块中使用class item导入MODULES,并将这个类名追加到MODULES,所以我不必在'modules/__ init __。py'中导入类名。哇,太简单了,谢谢!有时候这只是压倒我。 – 2012-07-13 14:04:39