Возникла проблема при импорте пакетов из родительского каталога (Python 3) - PullRequest
1 голос
/ 06 июня 2019

У меня есть следующая структура проекта: ( Примечание: Это пример структуры моего исходного проекта.)

proj1/
     __init__.py
    App/
        __init__.py
        Handlers/
                __init__.py
                Sum.py
    Tests/
         __init__.py
         Handlers/
                 __init__.py
                 SumHandler.py
    tests.py

Мой tests.py =>

import unittest
import Tests

def suite():
    suite = unittest.TestSuite()
    module = __import__('Tests.Handlers.SumHandler', fromlist=['object'])
    suite.addTest(unittest.TestSuite(map(unittest.TestLoader().loadTestsFromModule, [module])))
    return suite

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    test_suite = suite()
    result = runner.run (test_suite)
    print("---- START OF TEST RESULTS")
    print(result)
    print("---- END OF TEST RESULTS")

Мой __init__.py =>

import sys as _sys
class Package(object):
    def __init__(s, local):
        import os.path
        s.cache = {}
        s.local = dict((k, local[k]) for k in local)
        s.root = os.path.realpath(os.path.dirname(s.local["__file__"]))
    def __getattr__(s, k):
        if k in s.local: return s.local[k]
        if k in s.cache: return s.cache[k]
        path = list(s.local["_sys"].path)
        s.local["_sys"].path = [s.root]
        try:
            module = __import__(k, globals(), locals(), ['object'], 0)
            name = k[0].capitalize() + k[1:]
            s.cache[k] = getattr(module, name) if hasattr(module, name) else module
        finally: s.local["_sys"].path[:] = path
        return s.cache[k]
_sys.modules[__name__] = Package(locals())

Мой SumHandler.py =>

import unittest
import App

class SumHandler(unittest.TestCase):

    def setUp(self):
        self.a = 10
        self.b = 5
        self.sum = App.Handlers.Sum()

    def test_add(self):
        self.assertEqual(self.sum.add(self.a, self.b),15)

    def tearDown(self):
        del(self.a, self.b)

Мой Sum.py =>

class Sum():
    def add(self, x, y):
        return x + y

Я использую unittest framework для проверки кода из моего каталога приложений. Теперь, когда я запускаю файл tests.py с указанной выше структурой каталогов, я получаю следующую ошибку =>

Traceback (most recent call last):
  File "/Users/Sharvin/proj_1/Tests/Handlers/SumHandler.py", line 9, in setUp
    self.sum = App.Handlers.Sum()
AttributeError: module 'App' has no attribute 'Handlers'

Вопрос:

Я пытаюсь импортировать весь каталог App внутри пакета SumHandler в Tests/Handlers, чтобы я мог импортировать несколько пакетов из каталога App. Как мне этого добиться?

...