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

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()

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)

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)

几点小结

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

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

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

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

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

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

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

  • 有一个启动入口的项目

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

一个工程示例

为了测试环境路径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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150362.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL概念

原理定义概念 定义 数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库 数据库是长期储存在计算机内、有组织的、可共享的数据集合 分类: (1)非结构化数据: 数据相对来讲没有固定的特点&#…

[强网杯 2022]factor有感

可直接私信+Q 3431550587 此题记录主要是他运用了几个新看见的攻击思路和拜读了一篇论文,所以写写。题目源码: #encoding:utf-8 from Crypto.Util.number import * from gmpy2 import * from random import randint from flag import flagd…

uni-app:showModal中实现弹窗中文本框输入

效果 代码 <template><view><!-- 显示弹窗的按钮 --><button click"showInputDialog">显示弹窗</button></view> </template><script> export default {methods: {showInputDialog() {uni.showModal({title: 请完成…

电影大师杂记

假期集中刷了好多书&#xff0c;游戏和电影&#xff0c;在虚拟世界里猛烈的各种闲逛&#xff0c;cyberpunk 2077到blade runner&#xff0c;到异形&#xff0c;到终结者&#xff0c;到星球大战&环太平洋&#xff0c;到工业光魔&#xff0c;还有各种编程的书。。。 hmmm&…

Spring的AOP开发-基于xml配置的AOP

目录 基于xml配置的AOP xml方式AOP快速入门 xml方式AOP配置详解 xml方式AOP原理剖析&#xff08;后面再深入理解一下&#xff09; AOP底层两种生成Proxy的方法 基于xml配置的AOP xml方式AOP快速入门 在前面我们自己编写的AOP基础代码还存在一些问题&#xff0c;主要是 被…

【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

目录 1. 题目1.1 存储过程1.2 存储函数1.3 事务处理 2. 解答2.1 存储过程2.2 存储函数2.3 事务处理 1. 题目 1.1 存储过程 创建表 RandNumber &#xff1a;字段&#xff1a;id 自增长&#xff0c; data int&#xff1b; 创建存储过程向表中插入指定个数的随机数&#xff08;1-…

【软件测试】自动化测试selenium(二)

文章目录 三. 掌握Selenium常用的API使用1. webdriver API2. 操作测试对象3. 添加等待4. 打印信息5. 浏览器的操作6. 键盘事件7. 鼠标事件8. 定位一组元素9. 多层框架/窗口定位10. 下拉框处理11. 弹窗处理12. 上传文件13. 关闭浏览器14. 切换窗口15. 截图操作 三. 掌握Selenium…

基于electron25+vite4创建多窗口|vue3+electron25新开模态窗体

在写这篇文章的时候&#xff0c;查看了下electron最新稳定版本由几天前24.4.0升级到了25了&#xff0c;不得不说electron团队迭代速度之快&#xff01; 前几天有分享一篇electron24整合vite4全家桶技术构建桌面端vue3应用示例程序。 https://www.cnblogs.com/xiaoyan2017/p/17…

【雷达原理】雷达测距原理及实现方法

目录 一、雷达测距原理1.1 基本原理1.2 实现方法1.3 与距离有关的概念 二、MATLAB仿真实验2.1 应用案例2.2 MATLAB代码 一、雷达测距原理 1.1 基本原理 我们知道&#xff0c;电磁波的传播速度为光速 c c c&#xff0c;若雷达与目标之间的距离为 R R R&#xff0c;则雷达发出…

QT实现tcp服务器客户端

服务器.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xff0c;服务器已经成功进入监听状态…

LVGL_基础控件滑动条slider

LVGL_基础控件滑动条slider 1、创建滑动条控件 // 创建一个 slider 组件(对象)&#xff0c;他的父对象是活动屏幕对象 lv_obj_t *slider lv_slider_create(lv_scr_act()); LV_LOG_USER("lv_slider_get_value(slider) %d", lv_slider_get_value(slider));/* 设置位…

全屋灯具选购指南,如何选择合适的灯具。福州中宅装饰,福州装修

灯具装修指南 灯具就像我们家里的星星&#xff0c;在黑暗中带给我们明亮&#xff0c;可是灯具如果选择的不好&#xff0c;这个效果不仅体现不出来&#xff0c;还会让人觉得烦躁。 灯具到底该怎么选呢&#xff1f;装修灯具有哪些注意事项呢&#xff1f;给大家做了一个总结&#…

基于springboot的论坛网站

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 普通管理员管理 交流论坛 交流论坛评论 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了…

C语言qsort函数

排序qsort int int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b;//先强转成int型&#xff0c;后解引用取值比较大小 }字符串数组 char a[] “hello world” //字符串数组&#xff0c;存放的是字符 int cmp(const void *a, const void *b) {return *(…

罗彻斯特大学探讨ChatGPT等人工智能将如何影响高等教育

人工智能聊天机器人ChatGPT持续引起互联网用户的热议&#xff0c;它能够回答关于各个领域的问题&#xff0c;创作歌曲、食谱&#xff0c;起草电子邮件等等。罗切斯特的教职员工和管理人员就他们如何处理 ChatGPT 以及它如何影响未来的教学和学习提出了他们的想法。 “让这项技…

快排(三种单趟排序法,递归非递归算法)

快排发明者:霍尔 (Sir Charles Antony Richard Hoare) 是一位英国计算机科学家。 计算机领域的爵士——托尼霍尔(Tony Hoare)(1934年1月11日出生),英文全称Sir Charles Antony Richard Hoare,常被称为Tony Hoare或者C. A. R. Hoare,1959年博士毕业于

idea清空缓存类

解决办法 网上有很多是让你去清空什么maven依赖&#xff0c;但假如这个项目是你不可以大刀阔斧的话 可以清空idea缓存 选择 Invalidate 开头的 然后全选 运行重启idea OK

FISCO BCOS(三十七)———FISCOBCOS应用开发,交易hash、区块高度的获取

这个需求怎么做? 交易hash的获取方式有很多,这里先介绍一种方式。 根据块高查询区块信息 https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Front/interface.html那我们如何知道现在的区块高度是多少? https://webasedoc.readthedocs.io/zh_CN/latest/docs/W…

VSCode Intellij IDEA CE 数据库连接

VSCode & Intellij IDEA CE 数据库连接 大概记一下现在正在用的几个工具/插件 VSCode VSCode 里面的工具我下载了很多&#xff0c;如果只是链接 MySQL 的话&#xff0c;可能用 Jun Han 这位大佬的 MySQL 就好了&#xff1a; 使用这个插件直接打开 .sql 文件单击运行就能…

nodejs+vue临沂特色产品销售平台elementui

从实际工作出发&#xff0c;对过去的临沂特色产品销售平台存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息 提高了工作的效率。 随着信息化社会的形成和微电子技术日新月异的发展&#xff0c;临沂特色产品销售平台是针对目前临沂特色产品销售…