2010-12-21 28 views
3

を失敗:Pythonの__import__がそうように私は、ディレクトリ構造を持っている

|- project 
    |- commands.py 
    |- Modules 
    | |- __init__.py 
    | |- base.py 
    | \- build.py 
    \- etc.... 

私は__init__.py

commands = [] 
hooks = [] 

def load_modules(): 
    """ dynamically loads commands from the /modules subdirectory """ 
    path = "\\".join(os.path.abspath(__file__).split("\\")[:-1]) 
    modules = [f for f in os.listdir(path) if f.endswith(".py") and f != "__init__.py"] 
    print modules 
    for file in modules: 
     try: 
      module = __import__(file.split(".")[0]) 
      print module 
      for obj_name in dir(module): 
       try: 
        potential_class = getattr(module, obj_name) 
        if isinstance(potential_class, Command): 
         #init command instance and place in list 
         commands.append(potential_class(serverprops)) 
        if isinstance(potential_class, Hook): 
         hooks.append(potential_class(serverprops)) 
       except: 
        pass 
     except ImportError as e: 
      print "!! Could not load %s: %s" % (file, e) 
    print commands 
    print hooks 

に次のコードを持っている私は、適切なコマンドをロードするために__init__.pyを取得しようとしています私はいつもmodule = __import__(file.split(".")[0])でImportErrorをヒットしましたが、__init__.pyとbase.pyなどはすべて同じフォルダにあります。私は、モジュールファイルのどれもに何も必要がないことを確認しました__init__.py、私は本当に何をするのを失っている。

+0

'__import__'には、特に' fromlist'と覚えておかなければならない重要な悩みがあります。それを探して、あなたがそれを理解できるかどうかを見てください。 –

+0

'path = os.path.dirname(os.path.abspath(__ file __))'(より正確で偶然にクロスプラットフォーム) –

+0

'load_modules()'がどこからどのように呼び出されていますか? – martineau

答えて

2

システムパス上にモジュールがありません。あなたのpath = ...行の後

import sys 
sys.path.append(path) 

を追加すると、設定する必要があります。私のテストスクリプトは次のとおりです:

import os, os.path, sys 

print '\n'.join(sys.path) + '\n' * 3 

commands = [] 
hooks = [] 

def load_modules(): 
    """ dynamically loads commands from the /modules subdirectory """ 
    path = os.path.dirname(os.path.abspath(__file__)) 

    print "In path:", path in sys.path 
    sys.path.append(path) 

    modules = [f for f in os.listdir(path) if f.endswith(".py") and f != "__init__.py"] 
    print modules 
    for file in modules: 
     try: 
      modname = file.split(".")[0] 
      module = __import__(modname) 
      for obj_name in dir(module): 
       print '%s.%s' % (modname, obj_name) 
     except ImportError as e: 
      print "!! Could not load %s: %s" % (file, e) 
    print commands 


load_modules() 
関連する問題