python sys.path.append 获取上一级目录 获取上上级目录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
python程序 遇到 执行文件 调用上级目录或其他目录下的配置文件的情况
一个由字符串组成的列表,用于指定模块的搜索路径。初始化自环境变量 PYTHONPATH
,再加上一条与安装有关的默认路径。
程序启动时将初始化本列表,列表的第一项 path[0]
目录含有调用 Python 解释器的脚本。如果脚本目录不可用(比如以交互方式调用了解释器,或脚本是从标准输入中读取的),则 path[0]
为空字符串,这将导致 Python 优先搜索当前目录中的模块。注意,脚本目录将插入在 PYTHONPATH
的条目之前。
程序可以随意修改本列表用于自己的目的。只能向 sys.path
中添加 string 和 bytes 类型,其他数据类型将在导入期间被忽略。
sys #https://docs.python.org/zh-cn/3/library/sys.html#sys.path
pathlib #https://docs.python.org/zh-cn/3/library/pathlib.html
一、目录结构
F:\PYTHON-WORK\PROJECT
│ app.py
│
├─logs
└─src
│ db_tool.py
│
├─api
├─script
│ a.py
│
├─statics
└─temp
二、方法
方法 | 作用 |
---|---|
os.getcwd() | 获取当前目录 |
os.path.join() | 拼接路径 |
os.path.dirname() | 获取上一级目录 |
os.path.abspath() | 获取绝对路径 |
Path(“path”).parent | 获取上一级目录 |
三、获取db_tool.py中的方法
pwd #F:\PYTHON-WORK\PROJECT
python app.py #调用db_tool from src.db_tool import get
pwd #F:\PYTHON-WORK\PROJECT\src\script
python a.py #调用db_tool
这个时候因为在script下执行 a.py 所以获取不到src 需要通过sys.path.append 追加父级目录
import sys
print(sys.path)
sys.path.append("F:\PYTHON-WORK\PROJECT") #追加project目录,使python执行时优先搜索project目录
#或者使用 pathlib sys.path.append(str(Path(__file__).parent.parent.parent))
print(sys.path)
from src.db_tool import get
#输出
['F:\\PYTHON-WORK\\PROJECT\\src\\script', 'F:\\install\\miniconda\\python39.zip', 'F:\\install\\miniconda\\DLLs', 'F:\\install\\miniconda\\lib', 'F:\\install\\miniconda']
['F:\\PYTHON-WORK\\PROJECT\\src\\script', 'F:\\install\\miniconda\\python39.zip', 'F:\\install\\miniconda\\DLLs', 'F:\\install\\miniconda\\lib', 'F:\\install\\miniconda', 'F:\\PYTHON-WORK\\PROJECT']
然后把绝对路径换成相对路径
sys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
建议不要用 sys.path.append(“…/…”)
这个是根据当前执行python a.py 的位置 执行 …/…/ 而不是以文件所在的位置 执行 …/…/
总结
linux crontab 执行的位置为当前用户的根目录