如何在multi-dir Python工具中设置导入,以便可以通过Pycharm/terminal运行单元测试,同时为Python初学者提供友好的用户体验?

如何在multi-dir Python工具中设置导入,以便可以通过Pycharm/terminal运行单元测试,同时为Python初学者提供友好的用户体验?,python,pycharm,python-import,Python,Pycharm,Python Import,上下文 我正在创建一个工具,与我一起工作的人可以通过继承基类来添加东西。他们需要使用实用程序,使用Pycharm或终端运行单元测试,并能够任意创建子目录以保持良好的组织 我正在努力找出如何让Pycharm和终端在运行Pycharm和终端的单元测试时允许相同的导入。我已经读了很多关于Python导入的书,我仍然发现导入是Python中最难理解的东西。我希望避免到处添加sys.path.appends,因为我希望Pycharm能够为实用程序的使用提供提示。我认为相对导入将提供我所需要的,但我不认为它

上下文
我正在创建一个工具,与我一起工作的人可以通过继承基类来添加东西。他们需要使用实用程序,使用Pycharm或终端运行单元测试,并能够任意创建子目录以保持良好的组织

我正在努力找出如何让Pycharm和终端在运行Pycharm和终端的单元测试时允许相同的导入。我已经读了很多关于Python导入的书,我仍然发现导入是Python中最难理解的东西。我希望避免到处添加sys.path.appends,因为我希望Pycharm能够为实用程序的使用提供提示。我认为相对导入将提供我所需要的,但我不认为它们是用户友好的,并且随着潜在的任意目录结构更改,相对导入可能会反复中断

实际问题

  • 有没有更好的方法来做我正试图做的事情,以缓解我面临的问题
  • 在我定义的约束条件下,这可能吗
  • 我想避免的事情是,为了使它对用户友好,因为一些Python初学者将使用它

  • 相对进口
  • 需要在子类中的任何位置使用sys.path.append
  • 需要能够:

  • 从代码之外的地方调用main.py
  • 从代码之外的地方调用Call_unit_tests.py
  • 能够使用Pycharm为子类/实用程序运行单元测试
  • 能够从终端运行子类的单元测试
  • 目录结构

    my_project
    |-- main.py
    |-- call_unit_tests.py
    |-- base_class.py
    |-- utilities
       - utility_class.py
    |-- subclasses
       - sub_class.py
       |-- more_subclasses
          - another_sub_class.py
    
    main.py

    if __name__ == '__main__':
        subclasses = create_instances_of_all_subclasses()
        for c in subclasses:
            c.do_things()
    
    if __name__ == '__main__':
        run_all_the_subclass_unittests()
        run_all_the_utilities_unittests()
    
    import unittest
    from utilities.utility_class import Utility
    from base_class import BaseClass # not sure how
    
    class SubClass(BaseClass)
        def __init__(self):
            Utility().do_something_useful()
    
    class UnitTests(unittest.TestCase):
        def setUp(self):
            test_this_class = SubClass()
    
    if __name__ == '__main__':
        unittest.main()
    
    调用单元测试.py

    if __name__ == '__main__':
        subclasses = create_instances_of_all_subclasses()
        for c in subclasses:
            c.do_things()
    
    if __name__ == '__main__':
        run_all_the_subclass_unittests()
        run_all_the_utilities_unittests()
    
    import unittest
    from utilities.utility_class import Utility
    from base_class import BaseClass # not sure how
    
    class SubClass(BaseClass)
        def __init__(self):
            Utility().do_something_useful()
    
    class UnitTests(unittest.TestCase):
        def setUp(self):
            test_this_class = SubClass()
    
    if __name__ == '__main__':
        unittest.main()
    
    sub_class.py

    if __name__ == '__main__':
        subclasses = create_instances_of_all_subclasses()
        for c in subclasses:
            c.do_things()
    
    if __name__ == '__main__':
        run_all_the_subclass_unittests()
        run_all_the_utilities_unittests()
    
    import unittest
    from utilities.utility_class import Utility
    from base_class import BaseClass # not sure how
    
    class SubClass(BaseClass)
        def __init__(self):
            Utility().do_something_useful()
    
    class UnitTests(unittest.TestCase):
        def setUp(self):
            test_this_class = SubClass()
    
    if __name__ == '__main__':
        unittest.main()