首页 > 技术文章 > Python模块的导入以及软件开发规范

baolin2200 2017-08-04 00:26 原文

Python文件的两种用途

1 . 当脚本直接使用,直接当脚本运行调用即可

def func():
    print("from func1")

func()

2 . 当做模块被导入使用,但是又想测试当前脚本是否能正常运行就是用if name == 'main':

def func():
    print("from func1")


if __name__ == '__main__':
    func()

绝对导入和相对导入

我们在创建包时,是给别人导入引用的,而在包的内部也会有彼此之间的互相导入的需求,这时候就有了,相对导入和绝对导入

绝对导入:以包名做为起始
相对导入:用.或者..的方式作为起始(只能在一个包中使用,不能用于不同的目录内)
目录关系:

glance/                  # 顶层包目录
├── __init__.py   
├── api                  # 子层 api
│   ├── __init__.py

│   ├── policy.py

│   └── versions.py

├── cmd                   # 子层 cmd
│   ├── __init__.py

│   └── manage.py

└── db                    #  子层 db
    ├── __init__.py
│ 
    └── models.py
run.py   

文件内容:

#policy.py
def get():
    print('from policy.py')

#versions.py
def create_resource(conf):
    print('from version.py: ',conf)

#manage.py
def main():
    print('from manage.py')

#models.py
def register_models(engine):
    print('from models.py: ',engine)

例如:我们在glance/api/version.py中想要导入glance/cmd/manage.py

在glance/api/version.py

#绝对导入
from glance.cmd import manage
manage.main()

#相对导入..上两层目录
from ..cmd import manage
manage.main()

当模块包的路径不在一起时,可以直接将模块包glance_v1的上级路径加入到环境sys.path路径中

import sys
sys.path.append(r"C:\Users\Dpad\PycharmProjects\python\module")

import glance_v1
glance_v1.get()

软件开发规范:

一个项目应该由多个目录文件组成,每个目录存在配置的不同意义:

├── ATM
│   ├── bin            # 程序启动目录 (start.py执行程序文件)
│   │   ├── start.py
│   ├── core           # 程序主逻辑目录
│   │   └── src.py
│   ├── conf           # 程序配置目录
│   │   ├── settings.py
│   ├── db             # 程序数据目录
│   │   ├── mysql
│   ├── lib            # 程序包管理目录
│   │   ├── glance_v1
│   │   └── common.py
│   ├── log            # 程序日志目录
│   │   ├── acess.log
└───────└

在bin执行start.py文件下,想调用所有项目目录下的程序需要将ATM的路径加入到sys.path路径中:

cat /ATM/bin/start.py
import sys,os

# os.path.abspath(__file__)  # 表示当前程序文件start.py所在位置;
# os.path.dirname(os.path.abspath(__file__))  # start.py所在位置的上级目录
# os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # start.py所在位置的上上级目录,也就是ATM所在目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

推荐阅读