了解python导入系统和项目结构

时间:2017-11-08 19:57:08

标签: python python-import

假设我的项目组织如下:

ProjectRoot/
    __init__.py
    test.py
    A/
        __init__.py
        a_test.py
    B/
        __init__.py
        b_test.py

并假设a_test取决于b_test。因此源代码相对简单:

#
# a_test.py
#

from B.b_test import b_test_class

class a_test_class:
    def func(self):
        print("a_test_class")
        b_instance = b_test_class()
        b_instance.func()


if __name__ == "__main__":
    a_instance = a_test_class()
    a_instance.func()

#
# b_test.py
#

class b_test_class:
    def func(self):
        print("b_test_class")

#
# test.py
#

from A.a_test import a_test_class

if __name__ == "__main__":
    a_instance = a_test_class()
    a_instance.func()

只要我启动test.py脚本,一切都按预期工作。 Python加载所有模块没有任何麻烦并执行它们。现在问题来了: 如何在没有test.py的情况下启动a_test.py? 所以,基本上,我想要实现的是cd到projectRoot / A并执行a_test.py。这导致导入错误:没有名为' B'

的模块

目前,我已经能够创建一个具有以下结构的项目:

ProjectRoot/
    customLibModuleA/
        ...
    customLibModuleB/
        ...
    mainApp.py

我想要创建的是:

ProjectRoot/
    customLibModuleA/ #custom protocol implementation
        ...
    customLibModuleB/ #custom logging functions
        ...
    application1/ #server
        ...
    application2/ #client
        ...

我如何期望管理复杂的项目?欢迎任何对项目结构化手册和样式指南的良好参考。

1 个答案:

答案 0 :(得分:0)

这是我的时间解决方案,因为没有人提供pythonic方法。

文件夹结构如下:

ProjectRoot/
    __init__.py
    customLibModuleA/ #custom protocol implementation
        __init__.py
        ...
    customLibModuleB/ #custom logging functions
        __init__.py
        ...
    application1/ #server
        __init__.py
        __path_setup__.py
        server.py
        ...
    application2/ #client
        __init__.py
        __path_setup__.py
        client.py
        ...

__path_setup__.py内容为:

import sys
import os

os.sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))

应用程序脚本在导入之前有一些设置代码(server.py):

#
#settings up the environment
#
if __name__ == "__main__":
    exec(open("./__path_setup__.py").read())

#
# system and libraries imports
#
import customLibModuleA.whatever
...

仍然欢迎高质量的pythonic解决这个问题。