在python中将应用程序与逻辑和相对导入分开

时间:2017-09-28 09:30:12

标签: python

我想拥有以下项目的结构;逻辑在驻留在src中的模块和驻留在apps中的应用程序中实现。

my_project/
├── apps
│   ├── __init__.py
│   └── app.py
└── src
    ├── __init__.py
    └── code.py

我的目标是能够从命令行执行app.py(将my_project作为当前目录)。

目前,我所做的是在app.py中添加以下内容:

import sys
sys.path.insert(0, '.')

from src import code
import click

@click.command()
@click.option('--input', '-i', type=click.STRING)
def cli(input):
    print(code.my_func(input))

if __name__ == "__main__":
    cli()

我相信这是一种非pythonic解决方案。例如,它违反了PEP8。在应用程序code中包含模块app的正确/ pythonic方法是什么?

备注:这当然是一个非常小的例子。您可以将其作为最小示例here找到。

奖金更好,理想情况下,我希望能够从任何地方拨打app.py,它就能找到code.py。但我希望不管怎样安装项目。

1 个答案:

答案 0 :(得分:1)

只需将项目目录my_project的路径添加到PYTHON_PATH,然后您需要做的就是像往常一样导入src模块。

import os
import sys

PROJECT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))
sys.path.append(PROJECT_DIR)

from source import code

请记住,将.添加到sys路径是危险的。在所有情况下都避免使用它。