2014-01-29 121 views
2

我有一個面向組件的Python(3.3)項目。我有一個基地Component類。我希望其他人只需將其.py文件複製到某個文件夾中即可添加包含子類Component的模塊,而無需編輯任何內容。運行主程序應該簡單地導入在該文件夾中找到的所有.py文件。從我的主程序到這些子類的所有訪問都是通過Component.__subclasses__(),而不是通過明確的名稱。我並不特別擔心不同的用戶編寫的模塊中的代碼之間的名稱衝突,但我當然希望儘可能避免它,而不要將簡單的文件夾包含在文件夾中。如何構建Python包以便其他人可以輕鬆地添加模塊

如何構建一個包來實現這個目標?

回答

2

我會結構中的包是這樣的:

myPackage 
+ -- __init__.py 
+ -- Component.py 
+ -- user_defined_packages 
    + -- __init__.py # 1 
    + -- example.py 

思路:

  1. 讓用戶拖放到不同的文件夾,讓他們不要混淆你的代碼,他們
  2. 的初始化文件user_defined_packages可以加載所有子包,一旦導入user_defined_packages。它必須打印所有錯誤。

__init__.py#1

import os 
import traceback 
import sys 

def import_submodules(): 
    def import_submodule(name): 
     module_name = __name__ + '.' + name 
     try: 
      __import__(module_name) 
     except: 
      traceback.print_exc() # no error should pass silently 
     else: 
      module = sys.modules[module_name] 
      globals()[name] = module # easier access 

    directory = os.path.dirname(__file__) 
    for path_name in os.listdir(directory): 
     path = os.path.join(directory, path_name) 
     if path_name.startswith('_'): 
      # __pycache__, __init__.py and others 
      continue 
     if os.path.isdir(path): 
      import_submodule(path_name) 
     if os.path.isfile(path): 
      name, extension = os.path.splitext(path_name) 
      if extension in ('.py', '.pyw'): 
       import_submodule(name) 

import_submodules() 
相關問題