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.mzph.cn/news/96234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python标准库中内置装饰器@staticmethod@classmethod

装饰器是Python中强大而灵活的功能,用于修改或增强函数或方法的行为。装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的函数,通常用于在不修改原始函数代码的情况下添加额外的功能或行为。这种技术称为元编程&…

stm32之手动创建keil工程--HAL库

用CubeMx创建了好多stm32的工程,这里记录下手动创建keil工程的过程。 一、准备工作 1.1、下载对应的HAL库, 这里使用的是stm32f103c8t6, 下载地址stm32HAL库 在页面中输入对应型号点击进行二级页面进行下载 1.2、准备工程 各文件夹下具体操作如下&am…

破译滑块验证间距 破译sf顺丰滑块验证

废话不多说直接开干! from selenium import webdriver # 导入配置 from selenium.webdriver.chrome.options import Options import time from PIL import Image # 导入动作链 from selenium.webdriver.common.action_chains import ActionChains import random, st…

保研机试算法训练个人记录笔记(二)

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。(来源力扣) 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 解释:最长…

雷达电子箔条干扰和雷达诱饵简介

一、JAMMING 利用箔条、角反射器和诱饵进行机械干扰。 1、箔条(Chaff) 箔条是一种雷达干扰,在这种干扰中,飞机或其他目标散布一团薄薄的铝、金属化玻璃纤维或塑料,它们要么作为一组主要目标出现在雷达屏幕上,要么以多次回击淹没屏幕。 图1 箔条 2、箔条的雷达散射截面…

linux系统中三个重要的结构体

第一​:struct inode结构体 struct inode { struct hlist_node i_hash; struct list_head i_list; /* backing dev IO list */ struct list_head i_sb_list;​ //主次设备号 dev_t i_rdev;​ struct list_head i_devices; //用联合体是因为该…

java的反射

Java反射(Reflection)是一种在运行时检查类、方法、字段等结构的能力,以及在运行时实例化对象、调用方法、访问和修改字段等的能力。反射使得程序可以在运行时获取类的信息,操作类的属性和方法,而不需要在编译时就确定…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果,话不多说,先来看看视频效果吧:链接 在这里具体的代码就不放出来了,还是利用了uniapp的 uni.createAnimation 方法,因为cover-view 不支持一些css 的动画效果,所以这…

ICON图标设计优漫动游

ICON承载了App大部分功能的引导入口,是交互设计中是相当重要的一环。 ICON图标设计   ICON有一种象征意义或隐喻性,并在日常生活中经常遇到。icon代表了一些行动、事、人、真实的、虚拟的视觉符号。   ICON不仅是图标这么简单,它承…

如何使用百度“云一朵”来分析PDF文件

PDF 文件是一种常见的文件格式,用于存储文档、图像和其他内容。在许多情况下,我们需要对 PDF 文件进行分析,以提取其中的信息。百度“云一朵”提供了一个 PDF 分析 API,可以帮助我们轻松地对 PDF 文件进行分析。 在本博客文章中&…

rust函数

一 、函数定义 (一)格式 使用fn关键字 fn是 function 的缩写 1.无返回值的 fn 函数名 ( [paraname: type]... ) {函数体 }参数必须声明参数名称和类型 函数定义时指定的参数叫做 形参。调用时传递给函数的参数叫做 实参。 例子 fn another_function(…

基于Java的企业人事管理系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

进程互斥的软件实现方法,硬件实现方法以及互斥锁

1.进程互斥的软件实现方法 1.单标志法 1.算法思想: 两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。 也就是说每个进程进入临界区的权限只能被另一个进程赋予。 2.例子 因此,该算法可以实现“同一时刻最多只允许一个进程访问临界区”。 3.主要…

Polygon Mide状态模型:解决状态膨胀,而不牺牲隐私和去中心化

1. 引言 前序博客有: Polygon Miden:扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型Polygon Miden交易模型:Actor模式 ZKP > 并行 隐私 在Polygon Miden交易模型:Actor模…

定时器+按键控制LED流水灯模式+定时器时钟——“51单片机”

各位CSDN的uu们好呀,今天,小雅兰的内容是51单片机中的定时器以及按键控制LED流水灯模式&定时器时钟,下面,让我们进入51单片机的世界吧!!! 定时器 按键控制LED流水灯模式 定时器时钟 源代…

功能比较:Redisson vs Jedis

Redis最流行的两个Java客户端库是Redisson和Jedis。Redisson提供内存中的数据网格功能,支持Redis的各种分布式对象和服务。另一方面,Jedis是一个更轻量级的产品,它缺乏其他库的某些功能。 如果你正在为Redis寻找一个Java客户端库&#xf…

辅助驾驶功能开发-功能对标篇(6)-NOA领航辅助系统-上汽智己

1.横向对标参数 厂商上汽智己车型L7LS7上市时间20222022Q4方案11V5R1L+1DMS11V5R2L+1DMS摄像头前视摄像头2*(5M,长焦+广角)3侧视摄像头44后视摄像头11环视摄像头44DMS摄像头11雷达毫米波雷达554D毫米波雷达//超声波雷达1212激光雷达1*(速腾聚创M1,125线,905nm)2(速腾聚创)域控供…

【开源项目】tinyprintf 用于嵌入式系统的小型printf和sprintf库

【开源项目】tinyprintf 用于嵌入式系统的小型printf和sprintf库 简介 tinyprintf 是一个用于小型嵌入式系统的微型 printf 和 sprintf 库。这个库实际上只由两个文件 tinypprintf.c 和 tinyprintf.h 组成。 LICENSE:MIT, BSD 或者 LGPL license 项目地址&#…

微服务技术栈-Docker应用部署

文章目录 前言一、数据卷二、Docker 应用部署1、MySQL部署2、Tomcat部署3、Nginx部署4、Redis部署5、Kafka部署 总结 前言 之前文章讲到过,docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器,接下来我们将…

数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…