Как импортировать разн. вид вложенных файлов папок в Python - PullRequest
0 голосов
/ 06 ноября 2018

[Структура]

 Root
  |_ app
      |_util
          |_ log.py
      |_config.py
  |_ run.py

[run.py]

#import sys
#import os
#sys.path.insert(0, os.path.abspath('.'))

from app.config import Config

class App(object):
    def __init__(self):
        pass

    def run(self):
        Config.set_code(200)
        Config.print_code()

if __name__ == '__main__':
    app = App()
    app.run()

[config.py]

from app.util.log import Log

class Config(object):
    code = None
    def __init__(self):
        pass

    @classmethod
    def set_code(cls, code):
        cls.code = code    

    @classmethod
    def get_code(cls):
        return cls.code

    @classmethod
    def print_code(cls):
        Log.msg()

[log.py]

from app.config import Config

class Log(object):
    def __init__(self):
        pass

    @classmethod
    def msg(cls):
        code = Config.get_code()
        print('Code is: %r' % code)    

[Токовый выход]

File "C:\works\workout\tmp\app\util\log.py", line 1, in <module>
    from app.config import Config

ImportError: cannot import name 'Config' from 'app.config' (C:\works\workout\tmp\app\config.py)

[Ожидаемый результат]

Code is: 200

Еще одно сомнение: есть ли способ исправить корневой импорт как «приложение», а затем получить доступ к файлам этой папки / подпапки (любой глубины),

[приложение / sub1 / a.py]

 from app.util.xx import XX
 **from app.a import A**
 from app.aaa.bb import BB

 A.some_fn()

[приложение / a.py]

 from app.util.xx import XX
 **from app.sub1.a import A**
 from app.aaa.bb import BB 

 A.some_fn()

[приложение / sub1 / sub2 / a.py]

 **from app.sub1.a import A**
 **from app.sub1.sub2.b import B**
 from app.aaa.bb import BB 

 A.some_fn()

Если есть предложения или идеи, то, пожалуйста! Заранее спасибо,

1 Ответ

0 голосов
/ 06 ноября 2018

Циклическая зависимость между log.py и config.py является проблемой. Много раз циклических зависимостей можно избежать. Поэтому я бы посоветовал сначала попробовать.

Но если вы хотите сделать это с циклической зависимостью, вы можете сделать это, как описано здесь .

Для вашего решения это будет выглядеть так. Адаптироваться в log.py:

from app.config import Config до import app.config

и

code = Config.get_code() до code = app.config.Config.get_code()

...