python 包和模块的导入机制详解!

news/2025/2/9 5:47:53 标签: python

油管看到一个非常好的视频,在这里对一些视频内的重点内容进行总结。

注:本文主要供自己复习使用,仅提供个人认为的重点内容,难免有不周到之处,如果想要详细地了解相关机制,请在油管搜索:
Python’s Import System - Module object|Regular/Namespace Packages|Finders & Loaders|Relative imports

1.__file__

如果对模块和包的__file__属性分别进行打印,结果如下:

# 包的对应路径为相应的__init__文件
/data4/hyf/project/package/__init__.py
# 模块的对应路径为对应的绝对路径
/data4/hyf/project/tool.py

2.__name__

结果如下:

# 被执行函数的__name__值
__main__
# 被导入的模块的__name__值
tool
# 被导入的包的__name__值
package
# 被导入的包内的模块的__name__值
package.module1

3.包的__init__.py文件

导入包时,该文件被自动执行,该文件的全局变量、函数,可直接通过类似package.variable的方式进行访问。

4.导入包并不自动导入模块

若包的__init__.py文件内不含有import submodule(或是不含有__init__.py),那么是不会自动导入包内的模块的,比如,若某文件中代码如下

python">import package
print(package.module)

会遇到报错:

python">AttributeError: module 'package' has no attribute 'module'

想要导入包时,也自动导入其中的模块,需要在包的__init__.py文件中写入以下两行代码中的其中一行,这样就没有之前的报错了:

python"># 相对导入
from . import module
# 绝对导入
import package.module

或者,也可以直接使用:

python">import package.module

这样也是可以使用module模块的

5.对第四部分机制的解释

若没有__init__.py文件执行相对/绝对导入命令,package对象就没有指向子模块所在内存的变量,主函数自然就无法通过package找到package内的module

6.相对导入

使用相对导入时,不能超过顶层包的路径去导入其他包或者模块。如,不能在module内使用from .. import xxx,因为module只属于包package,在package之上,module并不属于其他包。

此外,只有在被其他模块导入时,相对导入才能正常工作。在主文件(python直接执行的py文件)中是不能使用相对导入的。

7.使用-m参数执行模块

可以使用python -m package.module的方式直接执行模块。如果package下有名为__main__.py的文件,可以直接执行

python">python -m package

这等效于

python">python -m package.__main__

http://www.niftyadmin.cn/n/5845614.html

相关文章

前端布局与交互实现技巧

前端布局与交互实现技巧 1. 保持盒子在中间位置 在网页设计中&#xff0c;经常需要将某个元素居中显示。以下是一种常见的实现方式&#xff1a; HTML 结构 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><m…

后台管理系统网页开发

CSS样式代码 /* 后台管理系统样式文件 */ #container{ width:100%; height:100%; /* background-color:antiquewhite;*/ display:flex;} /* 左侧导航区域:宽度300px*/ .left{ width:300px; height: 100%; background-color:#203453; display:flex; flex-direction:column; jus…

MySQL中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中有哪几种锁&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;锁的种类主要有以下几种&#xff0c;主要用…

国产编辑器EverEdit - Web预览功能

1 Web预览 1.1 应用场景 在编辑HTML文件时&#xff0c;可以通过EverEdit的Web预览功能&#xff0c;方便用户随时观察和调整HTML代码。 1.2 使用方法 1.2.1 使用EverEdit内部浏览器预览 选择主菜单查看 -> Web预览&#xff0c;或使用快捷键Ctrl B&#xff0c;即可打开Ev…

复原IP地址(力扣93)

有了上一道题分割字符串的基础&#xff0c;这道题理解起来就会容易很多。相同的思想我就不再赘述&#xff0c;在这里我就说明一下此题额外需要注意的点。首先是终止条件如何确定&#xff0c;上一题我们递归到超过字符串长度时&#xff0c;则说明字符串已经分割完毕&#xff0c;…

如果一个服务器突然间变的很卡,该如何排查?

1. 检查资源使用情况 CPU 使用率&#xff1a;使用命令 top 或 htop&#xff08;Linux 系统&#xff09;查看 CPU 使用情况。如果 CPU 使用率接近 100%&#xff0c;可能是某个进程消耗了过多的 CPU 资源。 内存使用率&#xff1a;查看内存的使用情况&#xff0c;如果内存接近或超…

mysql8 从C++源码角度看sql生成抽象语法树

MySQL 8的C源码中&#xff0c;SQL语句的词法分析和语法分析是通过一个复杂的解析器实现的&#xff0c;这个解析器将输入的SQL文本转换成抽象语法树&#xff08;AST&#xff09;。以下是该过程的主要步骤和相关组件&#xff1a; 主要组件 Lexer (词法分析器): MySQL使用了一个称…

C++ 23 的栈踪迹库(stacktrace)

1 Boost.Stacktrace ​ 当程序发生错误的时候&#xff0c;能提供的信息越多&#xff0c;对错误的定位就越有利。C#、Pyrhon、Java 等编程语言都提供调用栈踪迹回溯的功能&#xff0c;在错误发生的时候&#xff0c;除了报告错误发生的位置&#xff0c;还能输出函数调用栈信息。…