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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM