• Python学习之——测试环境路径的工程示例


    Python学习之——测试环境路径的工程示例

    Python环境路径

    参考: Python模块导入与路径管理
    1.对于一个纯Python工程, 在 import模块时,Python解释器的搜索顺序是先搜索built-in模块,然后搜索 sys.path这个路径列表中的模块

    sys.path这个路径列表依次存放着:当前脚本路径,PYTHONPATH路径,虚拟环境路径,site-packages路径

    2.__file__ 属性储存着当前执行文件的绝对路径,sys.path 中储存着搜索路径,并且sys.path[0]中存着调用python解释器的脚本所在的目录,即sys.path[0]等价于__file__。

    # 获取当前文件的绝对路径
    os.path.abspath(__file__) 
    # 返回当前文件所在的目录
    os.path.dirname(__file__) 
    # 返回path中的文件名
    os.path.basename(path) 
    # 获取当前工作目录,也就是在哪个目录下运行这个程序(慎用)
    """
    在F:\aaa\bbb\ccc运行 python TestDir.py,输出F:\aaa\bbb\ccc
    在F:\aaa\bbb运行 python ccc/TestDir.py,输出F:\aaa\bbb
    在F:\aaa运行 python bbb/ccc/TestDir.py,输出F:\aaa
    """
    os.getcwd()
       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3.添加其他目录进入sys.path中
    3.1 将执行文件当前文件夹下的aa文件夹添加到sys.path中

    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    ROOT_DIR = BASE_DIR
    # os.path.join 把目录和文件名合成一个路径
    sys.path.append(os.path.join(ROOT_DIR, 'aa'))
    for i in sys.path:
    	print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.2添加其他目录进入sys.path

    在实际开发中,默认包含了当前目录为搜索路径,所以,
    当前目录下的模块和子模块均可以正常访问。但是若一个模块需要import平级的不同目录的模块,或者上级目录里面的模块,就可以通过修改path来实现。

    # 添加执行文件所在目录的上层目录进入sys.path
    BASE_DIR = os.path.dirname(sys.path[0])
    ROOT_DIR = BASE_DIR
    sys.path.append(os.path.join(ROOT_DIR))
    for i in sys.path:
        print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    几点小结

    • 对于一个纯Python的服务器项目

    一般会写一个设置环境的shell脚本,去设置环境变量,后续便可以从该路径下开始import
    该脚本一般会先获取当前目录,从而获取到工程目录脚本目录PROJECT_PATH,库目录LIB_PATH,公共目录COMMON_PATH,
    从而可以将需要的目录都设置给PYTHONPATH,例如

    export PYTHONPATH=${PROJECT_PATH}:${LIB_PATH}:${COMMON_PATH}:${PYTHONPATH}
    
    • 1
    • 对于一个纯Python的客户端项目或者工具类项目

    1.可以直接把工程文件夹复制到 site_packages目录下,虽然可以使用,不过这种方式不好。

    2.使用 setup.py把项目安装在本地, 参考:Python 的 setup.py
    安装项目, 然后把安装路径加入到环境变量中

    # pip install 安装时的-v参数会输出安装的目录路径
    py -3 -m pip install -e . -v
    
    • 1
    • 2
    • 纯模块的项目

    每个模块可以独立运行的,可以每个模块从当前模块根目录开始import, 安装后每个模块根目录要添加到环境变量

    • 有一个启动入口的项目

    每个模块可以从启动入口所在的目录开始 import 即可

    # 目录结构
    top_dir/
            __init__.py
            main.py
          
    # top_dir/__init__.py 
    import sys
    import os
    # 将top_dir路径添加到sys.path
    top_dir_path = os.path.dirname(__file__)
    if top_dir_path not in sys.path:
        sys.path.append(top_dir_path)   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    一个工程示例

    为了测试环境路径import,在gitee上提交了一个用于测试Python环境路径的工程示例:https://gitee.com/selfsongs/test_path
    并在README.md中做了详细说明,该项目的setup.py中的packages字段用于指定对应的包,安装后所在的目录会被添加到环境变量中,我们在模块test_demo/module2/func2.py 需要import平级的不同目录的模块test_demo /module1/func1.py时,直接从test_demo开始即可

    from test_demo.module1.func1 import func1
    
    • 1
  • 相关阅读:
    外包干了10天,技术退步明显。。。。。
    利用CoreDNS实现DNS负载均衡
    机器学习从0到1
    Linux下运行Jmeter压测
    LeetCode 1620. 网络信号最好的坐标
    Python实现点选验证码识别, 模拟登陆小破站并自动发弹幕
    【暴力剪枝】CF1708D
    Java访问Scala中的Int类型
    QGraphicsView制作绘制图元工具资料整理(鼠标、平移、缩放)
    【AGC】报错ArrayIndexOutOfBoundsException
  • 原文地址:https://blog.csdn.net/qq_35987777/article/details/133625299