3

私はクラス「JCheq」を持っていて、静的varは 'logger'です。このPythonインポート循環参照を解決するには

JCheqインポートモジュールprinting_systemsですが、JCheq.loggerprinting_systemsから使用する必要があります。

import JCheqprinting_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' 
+0

参照をもう一度循環させないでください(例えば、 'printing_systems'を分解する)。あるいは、グローバルなスコープから取り込んだものを "欺く"ことができます。 –

+0

um ... 'printing_systems'モジュールに' printing_systems'という変数がありますか? 'import printing_systems'の代わりにモジュールから変数をインポートしようとしています –

+0

@BrianCainはいインポートをメソッドに移して今は動作しますが、それが受け入れ可能かどうかわかりません...どういう意味ですか分解している? – JorgeeFG

答えて

1

機能でimport文を移動するには、一般的に円形の輸入を解決するために使用されます。アプリケーションを再構築するのはコストがかかりすぎる場合に便利です(まったく役に立ちます)。

もう1つの解決方法はJCheq.loggerjcheq.pyprinting_systems/printing_systems.pyの両方をインポートする独自のモジュールに移動することです。

または、同じ引数が与えられたときに同じロガーを返すように、logger.Loggerをいくつかのレジストリに裏打ちされた(または単にメモする)ファクトリ関数にすることができます。この方法では、printing_system.pyjcheqの代わりにloggerをインポートするだけです。

+0

まあ、私は工場のアプローチを選択したようです。私が見つけた1つの問題は、import printing_systemsがJCheqの上にあるので、まずLoggerFactoryをインポートしてからロガーをグローバル変数にしてから、print_systemsをインポートする必要があります。それ以外の場合はprint_systemsが最初に解析され、同じパスでlog_levelの異なるロガーが作成されます(log_levelは一度だけ設定する必要がありオプションです) – JorgeeFG

+0

'logger.Logger'をメモしてみましたか?あなたがPython 3を使用している場合、すぐに 'functools.lru_cache'を使ってこれを行うことができます。私はそれが輸入注文の問題を解決するだろうと思う。 – daragua

関連する問題