目录结构

.
├── 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模块相关推荐

  1. 【Python】Python3.7.3 - sys.path 模块搜索路径详解

    文章目录 系统参考 sys.path - 模块搜索路径 用户站点目录(user site directory) 安装包到用户站点目录 第三方站点目录 site.py介绍 python启动选项 PYTH ...

  2. python oserror路径not found_详谈Python3 操作系统与路径 模块(os / os.path / pathlib)

    python如何判断一个目录下是否存在某个文件?如果小编突然在人群中很疯或者沉默,那时一定很难过. 1.使用os模块 用os模块中os.path.exists()方法检测是否存在test_file.t ...

  3. python3 打印目录下所有模块_python3基础12详解模块和包(库)|构建|使用

    本篇详解python中模块和包(库)的构建及使用. 欢迎微信随缘关注@pythonic生物人 本文您将学到什么? 1.模块 定义模块 导入模块 调用模块中函数方法1 模块名.函数名方法2 from 模 ...

  4. python3.6找到不_sqlite3模块

      在pytorch中要使用tensorboard,在使用的时候出现一个错误,提示: ModuleNotFoundError: No module named '_sqlite3' 字面意思,就是找不 ...

  5. python调用包的路径_Python3 模块、包调用路径详解

    如下所示: ''' 以下代码均为讲解,不能实际操作 ''' ''' 博客园 Infi_chu ''' ''' 模块的优点: 1.高可维护性 2.可以大大减少编写的代码量 模块一共有三种: 1.Pyth ...

  6. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  7. python如何自学模块_跟老齐学Python之Import 模块

    认识模块 对于模块,在前面的一些举例中,已经涉及到了,比如曾经有过:import random (获取随机数模块).为了能够对模块有一个清晰的了解,首先要看看什么模块,这里选取官方文档中对它的定义: ...

  8. python基础之import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  9. python导入模块的变量_python 环境变量和import模块导入方法(详解)

    1.定义 模块:本质就是.py结尾的文件(逻辑上组织python代码)模块的本质就是实现一个功能 文件名就是模块名称 包: 一个有__init__.py的文件夹:用来存放模块文件 2.导入模块 for ...

最新文章

  1. H3C 7506E基于时间的分时段上网的ACL
  2. Makefile:条件编译
  3. unity小工具 创建常用文件夹
  4. GridControl详解(八)菜单
  5. 20个Flutter实例视频教程-第03节: 不规则底部工具栏制作-1
  6. 自定义ui_如何允许用户自定义UI
  7. OpenJudge NOI 1.8 22:神奇的幻方
  8. osip和mysql_osip2和eXosip2协议
  9. “box-shadow”属性(转)
  10. go - struct
  11. php 关于token、签名、加密的一点理解
  12. hl3150cdn废粉仓清零_常见施乐联想兄弟等打印机加粉清零(废粉仓清零)方法
  13. 数二计算机考研大纲2016,2016数二考研大纲.doc
  14. 自监督学习(self-supervised learning)(20201124)
  15. 利用极域电子教室控制别人电脑
  16. 记录对接京东宙斯API -- 同步订单信息到自身系统
  17. 导入的java文件不显示文字_java 引入自定义字体font后出现的硬盘吃光的问题
  18. 1009 数字黑洞(C++)
  19. mac:截屏 自定义 格式,位置
  20. 股票预测 - ARIMA

热门文章

  1. date format picture ends before converting entire input string
  2. uni-app 快速发送短信
  3. 视觉特效专家24点行业工作经验总结
  4. 2019/9/6工学结合周记
  5. untiy实现文本滚动
  6. 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
  7. HDU6438 Buy and Resell
  8. JAVA实验七 图形用户界面的设计与实现
  9. java中文逗号替换英文逗号
  10. M40Z-025003TB0西克光电开关 订货号: 1200128