【问题标题】:Python __import__ specific submodules, depending in which software we arePython __import__ 特定子模块,取决于我们在哪个软件
【发布时间】:2013-10-09 11:59:00
【问题描述】:

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

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

  • 多软件/
    • 核心/
    • __init__.py
    • 软1/
      • __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

(在那些初始化文件中,您放置了 __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 # 

感谢您的帮助

一切顺利 卡米尔

【问题讨论】:

    标签: python import reload


    【解决方案1】:

    所以,您正在尝试抽象接口。有两种方法可以做到这一点,条件导入或变量赋值:

    # 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)
    

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

    【讨论】:

    • 您好 Corley,感谢您的回答,您的解决方案运行良好。我认为我的剧本太复杂了。我想要一些“程序性”功能来避免在 Core/_init_.py 中的每次导入都手动编写我认为您的解决方案更好,因为它更简单并且可以工作:-)
    猜你喜欢
    • 2023-03-17
    • 2011-02-01
    • 2014-03-22
    • 2010-10-21
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多