是否可以从其他子文件夹中的其他子文件夹自动导入模块?

时间:2010-05-10 16:55:21

标签: python plugins path

我有一种插件系统,有这种布局:

  • 的Python
    • SDK
      • 插件
        • Plugin1
        • Plugin2

所有3个文件都有__init__.py个文件。我想知道是否有可能从任何插件中import SDK(就像SDK在site-packages文件夹中一样)。

我遇到需要部署,更新,删除,添加或更改SDK文件或非管理员帐户下的任何插件的情况,并想知道我是否可以获得SDK一个干净的方式(我可以在所有插件中sys.path.append,但我想知道是否存在更好的选择。)

我想在Plugins init coulkd工作中使用它:

import sys
import os

ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__),'..'))

print ROOT_DIR
sys.path.append( ROOT_DIR )

但显然没有执行此代码(我想__init__.py在模块的加载中自动执行了魔法☹)

1 个答案:

答案 0 :(得分:2)

  • 的Python

    • start.py

      from SDK.Plugins import Plugin1
      print Plugin1.test()
      
    • SDK

      • __init__.py
      • 插件

        • __init__.py
        • Plugin1.py

          from SDK.Plugins import Plugin2
          def test():
              return Plugin2.test2()
          
        • Plugin2.py

          def test2():
              return "This worked!"
          

# python start.py
This worked!

这样可行,因为在Plugin1.py中您正在执行相对于start.py 的导入,即已执行的脚本,而不是自身。

如果要直接执行Plugin1.py,则必须弄乱路径,但如果它总是从文件夹层次结构中较高的脚本中使用,那么这是最干净的方法它