Python __import__ из той же папки не удается - PullRequest
3 голосов
/ 21 декабря 2010

У меня есть такая структура каталогов:

|- 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 для загрузки соответствующих команд и хуков в указанные списки, однако я всегда нажимаю ImportError на module = __import__(file.split(".")[0]), хотя __init__.py и base.py и т. Д. Все находятся в одной папке , Я убедился, что ничего из файлов модуля не требует ничего в __init__.py, поэтому я действительно не понимаю, что делать.

1 Ответ

2 голосов
/ 16 января 2011

Все, что вам не хватает, это наличие модулей на системном пути. Добавить

import sys
sys.path.append(path)

после вашей 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()
...