模块导入

一、模块导入

对于一个真实的pyhton程序,我们不可能自己完成所有的工作,通常都需要借助于第三方类库。此外,也不可能在一个源文件中编写整个程序的源代码,这些都需要以模块化的方式来组织项目的源代码。

导入模块需要用到import语法。import有两个主要的用法:

1.import 模块名 导入整个模块

2.form 模块名 import 成员名

二、 模块导入方式一:import 模块名

import md

在一个py文件下运行程序的步骤:

1首先会创建一个该py文件的名称空间

2运行模块(md.py文件)中的代码,并将成圣的名字和值存放在内存空间中

注意:不要多次导入相同模块

1.2访问模块名称空间中名字方法:模块名.名字

import md
md.read1()
md.read2()
md.change()

下面是md.py文件中的代码

money = 1000
def read1():
  print('md',money)
def read2():
  print('md模块')
  read1()
def change():
  global money
  money = 0

这样避免与执行py文件中的名字冲突。

 1.3多个模块的导入

应该转行写。并且写在执行文件的开头

import os
import time
import md

 1.4当模块名比较复杂,可以给模块名取别名

 为已经导入的模块起别名的方式对编写可扩展的代码很有用

1 import spam as sm
2 print(sm.money)

1.5在一行导入多个模块

1 import sys,os,re

三、模块导入方式二:from 模块名 import 成员名

这个方法是导入的模块中的具体某个功能

记住:

这个方法import后面是模块中的成员名;

而import 模块名方法,则import后面跟的模块名。

执行文件的代码:

from md import money
money = '我是执行文件中的money

print(money)

下面是md.py文件中的代码

money = 1000

 运行结果是:我是执行文件中的money。如果模块导入放在money下面结果就不一样了。原因用到from 模块名 import 具体内容的流程

会先创建执行文件的名称空间
    首次导入md.py模块
        1.运行md.py
        2.将产生的名字存放到md.py名称空间中
        3.直接拿到指向模块md.py名称空间中某个值的名字

 总结:from 模块名 import 成员名句式的缺点

1.访问模块中的名字不需要加模块名前缀
(因为这样,极易与执行文件的名字重复,导致打印结果不对。)
2.在访问模块中的名字可能会与当前执行文件中的名字冲突

 补充:

一、from 模块名(文件名) import 具体功能(需要调用的具体功能)

假如需要使用导入模块中的多个具体功能。可以用*号代替

from md1 import * 

但是这引起了一个缺点:占内存(一次性将所有名字放入内存)和不知道哪些名字能够使用(没有重复)

二、__all__

在这个模块调用模式下,写在被调用模块的代码中限制被执行文件获取的名字

__all__ = ['money','read1','read2']

 现在只有这些名字可以被执行文件引用

 四、循环导入

如果出现循环导入问题 那么一定是你的程序设计的不合理
循环导入问题应该在程序设计阶段就应该避免

执行文件代码:

from dir1.dir import m1
m1.f1()

m1的代码

print('正在导入m1')
def f1():
  from dir1.dir.m2 import y,f2
  print('m1.f1>>>y:',y)
  f2()
x = 'm1'

m2的代码

print('正在导入m2')
def f2():
  from dir1.dir.m1 import x
  print('m2.f2>>>x:',x)
y = 'm2'

解决循环导入问题的方式

1.方式1
将循环导入的句式写在文件最下方()

2.方式2
函数内导入模块

1.方式1
将循环导入的句式写在文件最下方()

2.方式2
函数内导入模块

五、_name_的使用

当一个文件被当做模块调用时,不希望一调用就出来打印结果,那么可以在被调用的文件中加入:

if __name__=='__main__':
    函数1()
    函数2()

因为文件被调用有一个特点,被当做执行文件时,__name__打印结果是__main__

当被当做模块导入时,结果为模块名

关于上面的代码还有一个简写形式:
输入main直接tab键

五、模块的查找顺序:

1、模块的查找顺序:

①、先从内存中找

②、再从内置中找

③、最后在sys.path中找(可以理解为环境变量),sys.path是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹

2、注意点:一定分清楚谁是执行文件谁是被导入文件(******),py文件名不应该与模块名(内置的,第三方的)冲突

3、将文件路径添加到sys.path中

import sys
sys.path.append(r'D:Python项目dir1')
from dir1.dir import md
# 当需要导入的模块不在执行文件的目录下时,可以利用这种方式找到模块文件
# 缺点:添加的路径太过绝对,用户自定义安装后会导致该路径失效,软件崩溃。

六、绝对导入和相对导入

绝对导入必须依据执行文件所在的文件夹路径为准
1绝对导入无论在执行文件中还是被导入文件都适用

相对导入
.代表的当前路径
..代表的上一级路径
...代表的是上上一级路径

注意相对导入不能再执行文件中使用
相对导入只能在被导入的模块中使用,使用相对导入 就不需要考虑
执行文件到底是谁 只需要知道模块与模块之间路径关系

from dir1.dir import m1

意思为:调用dir1下的dir文件夹中的m1文件

七、软件开发目录规范

项目名
    bin
        start.py(项目启动文件)
    conf
        settings.py(项目配置文件)
    core
        src.py(项目核心逻辑)
    db
        数据库相关文件
    lib
        common.py(项目所用到的公共的功能)
    log
        log.log(项目的日志文件)
    readme.txt(项目简介)
  1、strat.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os
import sys
 
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)
"""
pycharm会自动将你新建的最顶层的目录添加到sys.path中
上面这两句话,不是针对你的,是针对下载你这个软件的用户
"""
 
from core import src
 
if __name__ == "__main__":
    src.run()
 
# 当start.py文件主动执行时才会调用src.run()函数
 
# 1.将core文件路径添加到system path中  (...太low)
# 2.将项目文件夹添加到system path中
注意:不要手动拼接路径,跨系统时可能会出错
原文地址:https://www.cnblogs.com/ZDQ1/p/11196130.html