python3 使用相对路径 import模块
目录结构
.
├── apt_root.py
├── __init__.py
├── mod/
└── test.py
└── __init__.py
└── sub/
└── test.py
└── __init__.py
任务一:在mod/test.py中import 上级目录下的apt_root.py
任务二:在mod/test.py中import 上级目录的sub/test.py
前提
【为什么题目限定python3的import?】
因为网上能搜到的PEP都是python2的。例如PEP328。但是据我观察,python2和python3的import规则不同。
【绝对路径他不香吗,为什么限定用相对路径import模块?】
通过绝对路径引用模块,容易造成在后续改变代码结构,或者文件改名时,修改工作多的问题。而相对路径没有这个问题
解析
写这篇文章的一个出发点,是我发现import并没有很简单,至少对我造成了很多混乱,因此在这里进行分享,希望能上面两个任务能覆盖所有困难情况。首先一个混乱,是用不同方式执行test.py,其中的import能不能找到对应module是不同的。
用python test.py的方式
这时,在根目录下执行python mod/test.py ,
或者 进入mod子目录再执行python test.py的效果是一样的。
用网上查到的这些方式都会报错:
from . import apt_root
# 或者
from .. import apt_root
# 或者
from ..apt_root import *
我测试成功的写法是这样:
import syssys.path.append(".")
import app_root
所以,应该一个‘.’是上一级目录,两个'.'是上两级。意思是把上一级目录加入搜索路径。
用python -m test的方式
这种方式下,如果我的import是这样:
import app_root
(和直接python xxx.py不同)在不同目录下运行,会有不同效果!
一:在根目录下:python -m mod.test——运行成功
二:先进入mod子目录,再python -m test——运行失败
如果要运行成功,则应该这样:
sys.path.append("..")
import app_root
(又一个造成混乱的)python -m xxx时,把上级目录加入搜索路径,要用"..",这和python xxx.py时,用"."代表上级目录不同!
原因是python -m方式,会把当前运行命令的路径添加至sys.path。参见[python]自问自答:python -m参数?
所以,这种方法下,一定要结合当前运行命令的路径+默认sys.path中搜索路径+代码中sys.path.append新增路径,才能判断import是否能成功。
总结
容易造成混乱的地方:
1.相对路径的使用不能用from .. import XX,而要用sys.path.append(“..”)
2.python -m xxx和python xxx.py对import的写法中上级目录表示不同,前者用两个点,后者用一个点;
3.python -m xxx中import搜索路径与当前执行命令的目录相关;
python xxx.py与当前执行命令的目录无关
【欢迎关注我的微信公众号:人工智能Beta】
python3 使用相对路径 import模块相关推荐
- 【Python】Python3.7.3 - sys.path 模块搜索路径详解
文章目录 系统参考 sys.path - 模块搜索路径 用户站点目录(user site directory) 安装包到用户站点目录 第三方站点目录 site.py介绍 python启动选项 PYTH ...
- python oserror路径not found_详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
python如何判断一个目录下是否存在某个文件?如果小编突然在人群中很疯或者沉默,那时一定很难过. 1.使用os模块 用os模块中os.path.exists()方法检测是否存在test_file.t ...
- python3 打印目录下所有模块_python3基础12详解模块和包(库)|构建|使用
本篇详解python中模块和包(库)的构建及使用. 欢迎微信随缘关注@pythonic生物人 本文您将学到什么? 1.模块 定义模块 导入模块 调用模块中函数方法1 模块名.函数名方法2 from 模 ...
- python3.6找到不_sqlite3模块
在pytorch中要使用tensorboard,在使用的时候出现一个错误,提示: ModuleNotFoundError: No module named '_sqlite3' 字面意思,就是找不 ...
- python调用包的路径_Python3 模块、包调用路径详解
如下所示: ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Pyth ...
- Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)
全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...
- python如何自学模块_跟老齐学Python之Import 模块
认识模块 对于模块,在前面的一些举例中,已经涉及到了,比如曾经有过:import random (获取随机数模块).为了能够对模块有一个清晰的了解,首先要看看什么模块,这里选取官方文档中对它的定义: ...
- python基础之import模块导入和包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- python导入模块的变量_python 环境变量和import模块导入方法(详解)
1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...
最新文章
- H3C 7506E基于时间的分时段上网的ACL
- Makefile:条件编译
- unity小工具 创建常用文件夹
- GridControl详解(八)菜单
- 20个Flutter实例视频教程-第03节: 不规则底部工具栏制作-1
- 自定义ui_如何允许用户自定义UI
- OpenJudge NOI 1.8 22:神奇的幻方
- osip和mysql_osip2和eXosip2协议
- “box-shadow”属性(转)
- go - struct
- php 关于token、签名、加密的一点理解
- hl3150cdn废粉仓清零_常见施乐联想兄弟等打印机加粉清零(废粉仓清零)方法
- 数二计算机考研大纲2016,2016数二考研大纲.doc
- 自监督学习(self-supervised learning)(20201124)
- 利用极域电子教室控制别人电脑
- 记录对接京东宙斯API -- 同步订单信息到自身系统
- 导入的java文件不显示文字_java 引入自定义字体font后出现的硬盘吃光的问题
- 1009 数字黑洞(C++)
- mac:截屏 自定义 格式,位置
- 股票预测 - ARIMA
热门文章
- date format picture ends before converting entire input string
- uni-app 快速发送短信
- 视觉特效专家24点行业工作经验总结
- 2019/9/6工学结合周记
- untiy实现文本滚动
- 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
- HDU6438 Buy and Resell
- JAVA实验七 图形用户界面的设计与实现
- java中文逗号替换英文逗号
- M40Z-025003TB0西克光电开关 订货号: 1200128