• 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分别是用户登录注册、支付、生成订单项目代码.

  • 相关阅读:
    SQL TO XML
    C#中ArrayList 与 string、string[]数组 的转换
    C# 文件下载四方法
    Ilist<>与List<>的区别
    lamda表达式
    遍历实例对象的所有属性
    Readonly 与Const
    使用eclipse上传项目到开源中国代码托管Git@osc教程
    junit4中Assert断言的使用以及Mockito框架mock模拟对象的简单使用
    【每天一题ACM】 斐波那契数列(Fibonacci sequence)的实现
  • 原文地址:https://www.cnblogs.com/haifeima/p/9928115.html
Copyright © 2020-2023  润新知