[Python系列]Python的import的路径机制及引用报错详解

背景:在PyCharm中写的Python脚本通过IDE运行正常,但是通过CMD或者终端运行就会报错module找不到,所以学习下Python的import机制是如何生效的是非常有必要的

import报错问题描述:


其中main.py是我们的启动脚本

1.通过Pycharm运行是OK的:

2.通过终端或者CMD运行报错找不到module:


模拟报错代码:

其中main.py是我们的启动脚本:

# coding=utf-8

from src import common
from src.packone import test1

test1.py是一个module:

# coding=utf-8
from ..packtwo import test2

from .. import common

在Pycharm中运行正常,在终端中运行报错:

简单的将main.py的位置移动到和src同层级,通过终端执行就正常了:


原因是什么?

我们先看下Python中import的机制:

  • relative import
from . import yyy
from .xx import yyy
from ..xx import yyy
from ...xx import yyy

相对引入方式使用一个点号来标识引入类库的精确位置。与linux的相对路径表示相似,一个点表示当前目录,每多一个点号则代表向上一层目录。

  • absolute import
from src.packone import test1

绝对引用通过package的绝对路径引入module,且路径要从最上一层的package写起。

这里有几个问题需要注意:

一、使用relative import的脚本不能直接启动,否则会报错:Attempt relative import in non-package。


原因是:

相对引入使用被引入文件的__name__属性来决定该文件在整个包结构的位置,但是当python脚本被直接运行时,这个module的__name__就被设置__main__, 而不是module原来的name,这样相对路径就无法识别。

二、即使使用了绝对引用,启动脚本也要放在和top-level package同层级,如果放在topo-level的package下,在终端下运行会报错:No module named xxx

原因是:
1.Python通过import的模块搜索路径有:

  • 程序主目录
  • PYTHONPATH目录
  • 标准链接库目录
  • .pth文件目录(指python运行用户把有效的路径添加到模块搜索路径中去)

2.如果启动脚本放在src目录下:
2.1.程序主目录为src/,在这个目录下没有src这个module
2.2.PYTHONPATH目录下也不会有src这个module
2.3.标准链接库目录和.pth文件目录也不回搜索到src这个module

3.如果启动脚本放在src同级目录下:
程序主目录下即可搜索到src这个module,import便不会报错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 类 类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。 模块 模块,在Python可理...
    随风化作雨阅读 5,879评论 0 5
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,172评论 6 342
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 10,711评论 4 31
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,691评论 25 709

友情链接更多精彩内容