0

在 python 中导入模块我需要一点帮助。所以..没有不必要的喋喋不休:

我有特定的目录和模块结构:

  • 多软件/
    • 核/
    • __init__.py
    • 软1/
      • __init__.py
      • 控件.py
      • 钻机.py
    • 我的软件/
      • __init__.py
      • 控件.py
      • 钻机.py

现在从用户的角度来看,您只需导入:

import multisoft.Core as MSC

例如,您应该通过以下方式访问子模块:

MSC.Controls.someFunction()

该模块可以在不同的软件中使用,从用户的角度来看,您在哪个软件中都没有关系。这个模块的使用是一样的。当然,子模块的实现因软件而异。

我有一些必须遵守的限制。基本上每个模块都可以有更多或更少的文件。在每个软件实现中都必须考虑到 __all__ 变量:

  • MySoft/__init__.py
  • 软1/__init__.py

(在那些初始化文件中,您放置了 __all__ 变量:__all__ = ['Controls', '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 # 

谢谢你的帮助

所有最好的卡米尔

4

1 回答 1

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)

在任何一种情况下,您还需要让子模块重新加载它们需要的任何东西,即如果您想要这种行为,重新加载控件也必须重新加载其子模块。

于 2013-10-09T13:36:46.410 回答