Python函数-导入模块的顺序及原理
引入
当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作:
第一步,创建一个新的module对象(它可能包含多个module)
第二步,把这个module对象插到sys.module中
第三步,装载module的代码(如果需要,则必须先编译)
第四步,执行新的module中对应的代码。
在执行第三步时,首先需要找到module程序所在的位置,搜索的顺序是:
当前路径(以及从当前目录指定的sys.path),pythonpath,然后是python安装时设置的相关默认路径。正因为存在这样的顺序,所以如果当前路径或pythonpath中存在与标准module相同的module,则会覆盖标准module。也就是如果当前目录下存在xml.py,那么执行import xml时,导入的是当前目录下的module,而不是系统标准的xml。所以我们平常起名字时不能乱起。
了解这些之后,我们就可以先构建一个package,以普通module的方式导入,这样就可以直接访问此package中的各个module。python2中package必须包含一个__init__.py的文件。拥有这个文件使得python解释器将子目录整个也当成一个模块,然后直接通过“import 子目录.模块”导入即可。如果没有这个文件就会被当成一个普通文件夹,而不是模块。
一、模块
什么是模块?
模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称。
模块分为三种:
- 自定义模块
- 内置标准模块:python自带的
- 开源模块(第三方)
导入模块的本质,就是把python文件拿过来执行一次。
1、import导入
我有俩文件a.py和b.py,运行b.py,获得a里面得内容:

name='a.py' def func():
print('这个是a.py里面的函数') for i in range(5):
print(i)
func()
import a #import一个模块,就是把这个模块里的代码执行一遍

运行结果:

0
1
2
3
4
这个是a.py里面的函数

也可起别名:

name='a.py' def func():
print('这个是a.py里面的函数')
import a as apy # 起别名 print(apy.name)
apy.func()

运行结果:
a.py
这个是a.py里面的函数
2、 if __name__=='__main__' 的运用
# if __name__=='__main__':#在自己里执行是__name__;在别家执行是a(文件名)

name = 'a.py'
def func():
print('这个是a.py里面的函数') print(__name__)
if __name__ == '__main__': # 在自己里执行是__name__;
# 在别家执行是a(文件名)
for i in range(5):
func()
import a print(a.name)
a.func()

运行结果:

__main__
这个是a.py里面的函数
这个是a.py里面的函数
这个是a.py里面的函数
这个是a.py里面的函数
这个是a.py里面的函数
a
a.py
这个是a.py里面的函数

3、from导入,跟上面一样一样的
(1)用from导入func

name = 'a.py'
def func():
print('这个是a.py里面的函数') print(__name__)
if __name__ == '__main__': # 在自己里执行是__name__;
# 在别家执行是a(文件名)
for i in range(5):
func()
from a import func # 用from导入func func()

运行结果:
a
这个是a.py里面的函数
(2)用from导入func和name

name = 'a.py'
def func():
print('这个是a.py里面的函数') print(__name__)
if __name__ == '__main__': # 在自己里执行是__name__;
# 在别家执行是a(文件名)
for i in range(5):
func()
from a import func, name # 用from导入func和name func()
print(name)

运行结果:
a
这个是a.py里面的函数
a.py
二、导入模块的顺序:
1、从当前目录下找
2、从python的环境变量里面找
import一个文件夹的时候,就是执行这个文件夹下面的__init__.py

import sys print(sys.path) # 环境变量
sys.path.append(r'C:\Users\79954\PycharmProjects\ssz\day5') # r 源字符 加环境变量,加的时目录
sys.path.insert(0, r'C:\Users\79954\PycharmProjects\ssz\day5') # insert指定位置

运行结果:
['C:\\Users\\79954\\PycharmProjects\\ssz\\day5', 'C:\\Users\\79954\\PycharmProjects\\ssz', 'C:\\Program Files\\JetBrains\\PyCharm 2020.1.4\\plugins\\python\\helpers\\pycharm_display', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\python37.zip', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\lib', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm 2020.1.4\\plugins\\python\\helpers\\pycharm_matplotlib_backend', 'C:\\Users\\79954\\PycharmProjects\\ssz\\day5']
如以上运行结果所示:Pycharm也会自动帮咱加了环境,所以我们就可以导入ssz这个目录下的任何目录及文件了:
一个例子:

from day5 import tools #我们就可以导入ssz下的任何一个目录,pycharm会有提示
print(tools.test('s'))
def test(s):
return s + 'hhhhhhh'

运行结果:
shhhhhhh
再来一个例子:
from day2 import HelloWold
运行结果:
hello word!
蔡蔡长得非常 "帅气、高大威猛"
let'go,昌姐美丽又漂亮,因为是个“人妖”!!!
导入目录其他方式:

import sys # import day5
# result = day5.tools.test('ggg') # 报错(AttributeError: module 'day5' has no attribute 'tools') from day5 import tools # 这种方式没问题
print(tools.test('ggg')) from day5.tools import test # 这种方式没问题
result = test('ggg')
print(result)
def test(s):
return s + 'hhhhhhh'

运行结果:
ggghhhhhhh
ggghhhhhhh
例子:
1,在day6目录下建一个__init__.py,写点内容(一般创建文件夹自带了)
2,在day5目录下的a.py里面import day5
__init__
结果: import 一个文件夹时,就是执行这个文件夹下的__init__.py
1)、我们首先在day6下建一个tools.py
def test(s):
return s + 'hhhhhhh'
def test2():
print('ooooo')
2)然后在day5文件下建目录文件.py
import day6
result = day6.tools.test('xxx')
day6.tools.test2() #可多个导入
print(result)
运行结果:
__init__
ooooo
xxxhhhhhhh
三、第三方模块安装:
- python的安装目录
- python安装目录下面的scripts目录
首先,得确定环境是否正常(pip --help):

1、手动安装


2、带 .whl 结尾的需找到安装路径:pip install /Users/........
3、zip文件
- 先解压
- 进入解压目录
- python setup.py install
Python函数-导入模块的顺序及原理的更多相关文章
- python有三种导入模块的方法(转)
原文:http://www.cnblogs.com/allenblogs/archive/2011/11/15/2055149.html python有三种导入模块的方法 其一, import mod ...
- python中导入模块的本质, 无法导入手写模块的解决办法
最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...
- Python学习第二阶段,Day2,import导入模块方法和内部原理
怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...
- 二. python函数与模块
第四章.内置函数与装饰器详解 1.内置函数补充1 注:红色圆圈:必会: 紫红色方框:熟练: 绿色:了解 callable() 判断函数是否可以被调用执行 def f1(): pass f1() ...
- python函数,模块及eclipse使用
一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...
- 洗礼灵魂,修炼python(11)--python函数,模块
前面的章节你如果看懂了,基本算是入门了七八了,不过如果你以为python就这么点东西,你觉得很简单啊,那你就错了,真正的东西在后面,前面我说的几大核心其实也不是多么高深多么厉害的,那些东西是基础很常用 ...
- python函数,模块及eclipse配置python开发环境
一.eclipse的使用 1.作用 (1)最好用的IDE (2)可调式debug (3)查看可执行过程 (4)可查看源代码 2.安装eclipse及配置 目录安装Pythonpython for ec ...
- python函数参数类型及其顺序
根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...
- Python关于导入模块的一些感想:
写项目的时候,碰到这种情况 程序业务为core,里面有两个目录,core1 和core2 core1中有三个模块,business main main1 程序入口为bin目录下的project ...
随机推荐
- Qt:QMap
0.说明 QMap < Key , T > 一个QMap就是一个K-V对,也可以说是字典对象. 1)构造 构造一个Key是QString,Value是int的QMap: QMap<Q ...
- prometheus-数据展示之grafana部署和数据源配置
1.监控pods . prometheus再部署以后,会自带cAdvisor.结果如下: 2.K8S集群状态监控.需要使用kube-state-metrics插件.部署以后 kubernetes. ...
- 《MySQL实战45讲》个人笔记-基础篇
拜读了林晓斌大佬的<MySQL实战45讲>,特意做个知识点总结,以便后期回忆. 01.基础架构:一条SQL查询语句是如何执行的? Server 层包括连接器.查询缓存.分析器.优化器.执行 ...
- 实战:Spring AOP实现多数据源动态切换
需求背景 去年底,公司项目有一个需求中有个接口需要用到平台.算法.大数据等三个不同数据库的数据进行计算.组装以及最后的展示,当时这个需求是另一个老同事在做,我只是负责自己的部分. 直到今年回来了,这个 ...
- Lua中如何实现类似gdb的断点调试—06断点行号检查与自动修正
前面两篇我们对性能做了一个优化,接下来继续来丰富调试器的特性. 我们前面提到过,函数内并不是所有行都是有效行,空行和注释行就不是有效行.我们之前在添加断点的时候,并没有对行号进行检查,任何行号都能成功 ...
- 变量、变量作用域、常量final、变量的命名规范
变量 变量是什么:就是可以变化的量! Java是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域. 注意事项: 每个变量都有类型,类 ...
- CentOS 5.11源修改
CentOS 5.11源 将源中所有网址替换为 http://archive.kernel.org/centos-vault/你的版本/ 一条sed命令即可解决 sed -i 's@http://xx ...
- ArcMap操作随记(12)
1.[取色器]工具 [自定义]|[自定义模式]|[命令] 2.批量修改符号 [符号系统]→右键,[所有符号的属性] 3.将地图元素转换为图形 转换工具 4.好看的地图边框 [布局视图]→数据框上右键→ ...
- 用注册表清除Office Word文档杀手病毒
不久前,笔者打开word文件时遇到了一件离奇的怪事,常用的Word文件怎么也打不开,总是出现提示框:"版本冲突:无法打开高版本的word文档".再仔细查看,文件夹里竟然有两个名字一 ...
- Java案例之评委打分
/* 案例:评委打分,六个或者更多个评委打分,去到一个最高分,一个最低分,求其他评委的平均值(当评委数量发生改变时不需要进行二次修改) 需求:定义一个数组,长度为6,循环获取输入的数据 定义方法获取数 ...