2013-10-09 2 views
0

Мне не нужна помощь при импорте модулей в python. Так .. Без ненужной болтовни:Python __import__ определенные подмодули, в зависимости от которых мы находимся

У меня есть определенная структура каталогов и модулей:

  • Multisoft/
    • Ядро/
    • __init__.py
    • Soft1/
      • __init__ .py
      • Controls.py
      • Rigs.py
    • MySoft/
      • __init__.py
      • Controls.py
      • Rigs.py

Теперь с пользовательской точки вид, вы импортируете только:

import multisoft.Core as MSC 

И, например, вы должны получить доступ к подмодулям по:

MSC.Controls.someFunction() 

Этого модуль может быть использована в различном программном обеспечении, а также от пользователя с точки зрения не имеет значения, в каком программном обеспечение вы. Использование этого модуля одинаково. Конечно, реализация подмодулей отличается от одного программного обеспечения другим.

И у меня есть некоторые ограничения, которые я должен соблюдать. В основном каждый модуль может иметь больше или меньше файлов. И переменная __all__ должны быть приняты во внимание при каждой программной реализации:

  • MySoft/__ init__.py
  • Soft1/__ init__.py

(в этих INIT-х файлов вы положили __all__ переменную: __all__ = [ 'управление', ''] Rigs)

Я произвел часть кода, который в основном делать то, что я хочу сделать:

ядро ​​/ __init__.py

import os 
import sys 

def _softRecognize(): 

    if youAreInSoft1(): 
     directory = os.path.dirname(os.path.abspath(__file__)) 
     sys.path.insert(0,directory) 
     module = __import__('Soft1', fromlist=['*']) 
     globals().update(vars(module)) 


_softRecognize() 

Но я не могу перезагрузить данный модуль, и это одна из ограничений, которые я должен держать.

import multisoft.Core as MSC 
reload(MSC) 

# Error: reload(): module Soft1 not in sys.modules 
# Traceback (most recent call last): 
# File "<maya console>", line 1, in <module> 
# ImportError: reload(): module Soft1 not in sys.modules # 

Спасибо за любую помощь

Все лучший Камиля

ответ

0

Итак, вы пытаетесь абстрактный интерфейс.Есть два способа сделать это, либо условный импорт, или присвоение переменным:

# Conditional 
if youAreInSoft1(): 
    import Soft1.Controls as Controls 
    import Soft1.Rigs as Rigs 
else: 
    import Soft2.Controls as Controls 
    import Soft2.Rigs as Rigs 

reload(Controls) 
reload(Rigs) 

#Variable 
import Soft1 as _soft1 
import Soft2 as _soft2 

Controls = None 
Rigs = None 

global Controls, Rigs 

if youAreInSoft1(): 
    Controls = _soft1.Controls 
    Rigs = _soft1.Controls 
else: 
    Controls = _soft2.Controls 
    Rigs = _soft2.Controls 

reload(Controls) 
reload(Rigs) 

В любом случае, вы также должны иметь подмодули перезагружать, что им нужны, а также, то есть перегрузки управления придется перезагрузить его подмодули а также вниз, если вы хотите этого поведения.

+0

Hi Corley, Спасибо за ваш ответ, ваше решение работает хорошо. Я думаю, что я слишком много усложнил свой сценарий. Я хотел, чтобы некоторые «процедурные» функции не позволяли вручную вводить каждый импорт в Core/\ __ init__.py Я думаю, что ваше решение лучше, потому что оно проще и работает :-) –

Смежные вопросы