如何解决这个Python导入循环引用

时间:2016-03-23 14:51:55

标签: python python-3.x python-import python-module circular-reference

我有一个类JCheq,其静态var名为'logger'。

JCheq导入模块printing_systems,但我需要使用JCheq.logger中的printing_systems

我将import JCheq放入printing_systems.py后,我的代码无法编译。

jcheq.py

from printing_systems import printing_systems
from logger import logger

class JCheq:
    logger = logger.Logger('logs/jcheq.log', loglevel=logger.Logger.INFO)

    def __init__(self):
        pass
    ...

printing_systems / printing_systems.py

from jcheq import JCheq
class WinLPR:

    def __init__(self):
        pass

    @staticmethod
    def send(spool, params):
        temp_dir = tempfile.mkdtemp()
        try:
            JCheq.logger.log('Creando archivo temporal en dir: ' + temp_dir, logger.Logger.TRACE)

错误追踪:

Traceback (most recent call last):
  File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/jcheq.py", line 12, in <module>
    from printing_systems import printing_systems
  File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/printing_systems/printing_systems.py", line 7, in <module>
    from jcheq import JCheq
  File "/home/jsivil/Desktop/Proyectos/UNPAZ/jcheq/jcheq/jcheq.py", line 12, in <module>
    from printing_systems import printing_systems
ImportError: cannot import name 'printing_systems'

1 个答案:

答案 0 :(得分:1)

在函数中移动import语句通常用于解决循环导入问题。如果重组您的应用程序成本太高(如果有用的话),这很方便。

另一种解决方案是将JCheq.logger移动到jcheq.pyprinting_systems/printing_systems.py将导入的模块中。

或者,您可以使logger.Logger成为一个由某个注册表支持的工厂函数(或简单地记住它),以便在给出相同的参数时返回相同的记录器。这样,printing_system.py可以简单地导入logger,而不是导入jcheq