python3进阶之模块(七)

模块介绍

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块

import

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

形如:

    import module1,mudule2...
 import math 
 #这样才能正确输出结果
 print (math.sqrt(2))

from…import

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中

语法如下:

from modname import name1[, name2[, ... nameN]]

例如,要导入模块fib的fibonacci函数,使用如下语句:

from fib import fibonacci

注意
不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入

from … import *

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

注意
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。

as


__name__属性

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。

#!/usr/bin/python3
# Filename: using_name.py

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')`

dir() 函数

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

import sys

path = dir(sys) 
print(path);

模块制作

可以根据__name__变量的结果能够判断出,是直接执行的python脚本还是被引入执行的,从而能够有选择性的执行测试代码
main.py

import hello
hello.fuck();

hello.py

import sys

def fuck():
    path = dir(sys) 
    print(path);

使用__name__

import hello

hello.fuck();
hello.fuck();
import sys

def fuck():
    path = dir(sys) 
    print(path);

if __name__ ==  'main':
   print('程序自身在运行')
else:
   print('我来自另一模块')

模块中有__all__

如果一个文件中有__all__变量,那么也就意味着这个变量中的元素,不会被from xxx import *时导入

python中的包

  • 1.1 有2个模块功能有些联系
  • 1.2 所以将其放到同一个文件夹下
  • 1.3 使用import 文件.模块 的方式导入
  • 1.4 使用from 文件夹 import 模块 的方式导入
  • 1.5 在msg文件夹下创建__init__.py文件
  • 1.6 在__init__.py文件中写入
__all__ = ["sendmsg","recvmsg"]
  • 1.7 重新使用from 文件夹 import 模块 的方式导入

总结:
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包
有效避免模块名称冲突问题,让应用组织结构更加清晰


    1. init.py文件有什么用
      init.py 控制着包的导入行为
  • 2.1 init.py为空
    仅仅是把这个包导入,不会导入包中的模块

  • 2.2 all
    在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块

  • 2.3 (了解)可以在__init__.py文件中编写内容
    可以在这个文件中编写语句,当导入时,这些语句就会被执行

在这里插入图片描述

在这里插入图片描述
init.py文件

  1. 扩展:嵌套的包
    假定我们的包的例子有如下的目录结构:

在这里插入图片描述
Phone 是最顶层的包,Voicedta 等是它的子包。 我们可以这样导入子包:

import Phone.Mobile.Analog
Phone.Mobile.Analog.dial()

你也可使用 from-import 实现不同需求的导入

第一种方法是只导入顶层的子包,然后使用属性/点操作符向下引用子包树:

from Phone import Mobile
Mobile.Analog.dial('555-1212')

此外,我们可以还引用更多的子包:

from Phone.Mobile import Analog
Analog.dial('555-1212')

事实上,你可以一直沿子包的树状结构导入:

from Phone.Mobile.Analog import dial
dial('555-1212')

在我们上边的目录结构中,我们可以发现很多的 init.py 文件。这些是初始化模块,from-import 语句导入子包时需要用到它。 如果没有用到,他们可以是空文件。

包同样支持 from-import all 语句:

from package.module import *

然而,这样的语句会导入哪些文件取决于操作系统的文件系统。所以我们在__init__.py 中加入 all 变量。该变量包含执行这样的语句时应该导入的模块的名字。它由一个模块名字符串列表组成.。

模块发布

模块发布
模块发布

  • 1.mymodule目录结构体如下:
├── setup.py
├── suba
│   ├── aa.py
│   ├── bb.py
│   └── __init__.py
└── subb
    ├── cc.py
    ├── dd.py
    └── __init__.py

2.编辑setup.py文件

py_modules需指明所需包含的py文件

from distutils.core import setup

setup(name="dongGe", version="1.0", description="dongGe's module", author="dongGe", py_modules=['suba.aa', 'suba.bb', 'subb.cc', 'subb.dd'])

3.构建模块

python setup.py build

构建后目录结构

.
├── build
│   └── lib.linux-i686-2.7
│       ├── suba
│       │   ├── aa.py
│       │   ├── bb.py
│       │   └── __init__.py
│       └── subb
│           ├── cc.py
│           ├── dd.py
│           └── __init__.py
├── setup.py
├── suba
│   ├── aa.py
│   ├── bb.py
│   └── __init__.py
└── subb
    ├── cc.py
    ├── dd.py
    └── __init__.py

4.生成发布压缩包

python setup.py sdist

打包后,生成最终发布压缩包dongGe-1.0.tar.gz , 目录结构

.
├── build
│   └── lib.linux-i686-2.7
│       ├── suba
│       │   ├── aa.py
│       │   ├── bb.py
│       │   └── __init__.py
│       └── subb
│           ├── cc.py
│           ├── dd.py
│           └── __init__.py
├── dist
│   └── dongGe-1.0.tar.gz
├── MANIFEST
├── setup.py
├── suba
│   ├── aa.py
│   ├── bb.py
│   └── __init__.py
└── subb
    ├── cc.py
    ├── dd.py
    └── __init__.py

模块安装、使用

  • 1.安装的方式
    找到模块的压缩包
    解压
    进入文件夹
    执行命令python setup.py install
    注意:

如果在install的时候,执行目录安装,可以使用python setup.py install --prefix=安装路径

  • 2.模块的引入
    在程序中,使用from import 即可完成对安装的模块使用

from 模块名 import 模块名或者*

发布了243 篇原创文章 · 获赞 80 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/hiwoshixiaoyu/article/details/89365384