zoukankan      html  css  js  c++  java
  • python学习笔记:目录结构

    "项目目录结构"其实也是属于"可读性和可维护性"的范畴。

    目录组织方式

    关于如何组织一个较好的Python工程目录结构,已经有一些得到了共识的目录结构。在Stackoverflow的这个问题上,能看到大家对Python目录结构的讨论。

    这里面说的已经很好了,我也不打算重新造轮子列举各种不同的方式,这里面我说一下我的理解和体会。

    假设你的项目名为foo, 我比较建议的最方便快捷目录结构这样就足够了:

    Foo/
    |-- bin/
    |   |-- foo
    |
    |--conf/
    |  |--__init__.py
    |  |--settings.py
    | |-- foo/ | |-- tests/ | | |-- __init__.py | | |-- test_main.py | | | |-- __init__.py | |-- main.py | |-- docs/ | |-- conf.py | |-- abc.rst | |-- setup.py |-- requirements.txt |-- README

    简要解释一下:

    1. bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
    2. conf/:存放项目配置文件
    3. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py
    4. docs/: 存放一些文档。
    5. setup.py: 安装、部署、打包的脚本。
    6. requirements.txt: 存放软件依赖的外部Python包列表。
    7. README: 项目说明文件。

    除此之外,有一些方案给出了更加多的内容。比如LICENSE.txt,ChangeLog.txt文件等,我没有列在这里,因为这些东西主要是项目开源的时候需要用到。如果你想写一个开源软件,目录该如何组织,可以参考这篇文章

    如何使用不同目录下的文件

    以上图目录结构为例,我们在main.py中,使用bin目录下文件,首先需要找到Foo/目录,然后才能导入Foo/下的子目录的模块,并且需要做到自动获取,不能写死,这时候就使用到os模块

    import os

    import sys

    1、找到文件的绝对路径

    os.path.abspath(__file__)    #获取文件的绝对路径,包含文件名

    2、获取文件的目录

    os.path.dirname(os.path.abspath(__file__) )    #  例如main.py的目录是foo/ 

    3、再次获取文件目录的父目录

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__) ))

    4、添加到环境变量中

    sys.path.append(BASE_DIR)

    5、导入需要的目录

    ①.  import bin

    ②. from bin import *

    二种方式导入,各有优缺点,后续会详细讲解,至此,就可以使用其他目录的模块。

    =======================以上是我复制来的,以下用上课内容作为举例。=============================

    目录结构举例:

    start.py中的内容:

    #如果我们没有pycharm,需要部署到linux服务器上运行,那么该文件的路径需要加到环境变量中
    import os,sys
    res = os.path.abspath(__file__) #__file__是指当前的py文件,这行代码是取当前文件的绝对路径,加入到环境变量中。这样可以在cmd中运行了
    base_path = os.path.dirname(os.path.dirname(res))#os.path.dirname(res)是取父目录,两层是取上两级目录
    sys.path.insert(0,base_path)#把这个目录加入环境变量,这样就不用写死了。
    
    # print(res)
    # print(base_path)
    # E:PycharmProjectsday08_pythonmy_apiinstart.py
    # E:PycharmProjectsday08_pythonmy_api
    #以上代码必须写在最上面,因为要先加入环境变量,再导入。加上后在任何人电脑运行都可以了
    
    #===============================如果在parcharm中运行,上面的内容可以不用写======================
    
    from lib.service import server #导入server
    from lib import user,pay,order #导入其他的模块
    from conf.setting import server_info #导入数据库配置信息
    server.run(**server_info) #启动服务

    setting.py中的内容:

    #mysql 配置信息、连接数据库
    mysql_info = {
        'host':'xxx.xx.x.xx',
        'port':3306,
        'user':'xxx,
        'password':'123456',
        'db':'xxx',
        'charset':'utf8',
        'autocommit':True
    }
    
    #启动的配置文件
    server_info = {
        "host":'0.0.0.0',
        "port":5000, #启动服务的端口号
        'debug':True #是否是调试模式
    }

    service.py中的内容:

    #这个就指提供服务,直接写一个server.py文件,谁要用就导入
    import flask
    
    server = flask.Flask(__name__) #把当前这个python文件当做一个服务

    tools.py中的内容:

    #工具模块
    
    import pymysql
    from conf.setting import mysql_info # 导入我们在conf.setting里写的函数
    
    def my_db(sql):#执行数据库
        conn = pymysql.connect(**mysql_info)#两个星号把字典自动变成v-k形式
        cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
        cur.execute(sql)
        res = cur.fetchall()
        cur.close()
        conn.close()
        return res
    
    def check_float(s):
        '''
        这个函数的作用就是判断传入的字符串是否是合法的小数
        :param s: 传入一个字符串
        :return: True/false
        '''
        s = str(s)
        if s.count('.')==1:
            s_split = s.split('.')
            left,right = s_split
            if left.isdigit() and right.isdigit():
                return True
            elif left.startswith('-') and left[1:].isdigit() 
                and right.isdigit():
                return True
        return False

    而user.py、pay.py、order.py分别是用户登录注册、支付、生成订单项目代码.

  • 相关阅读:
    CDH 2、Cloudera Manager的安装
    204 01 Android 零基础入门 03 Java常用工具类 04 Java集合 04 Map集合 01 Map概述
    203 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 07 删除宠物猫信息数据(引入泛型知识点)
    202 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 06 查找宠物猫信息数据
    201 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 05 添加重复的宠物猫信息数据
    200 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 04 添加和显式宠物猫信息
    199 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 03 宠物猫信息管理概述
    198 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 02 案例:在集合中插入字符串
    197 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 01 Set概述
    196 01 Android 零基础入门 03 Java常用工具类 04 Java集合 02 List集合 05 案例:公告的删除和修改
  • 原文地址:https://www.cnblogs.com/haifeima/p/9928115.html
Copyright © 2011-2022 走看看