一、引入包

1.1 有2个模块功能有些联系

receiveMsg.py和sendMsg.py都在msg文件夹里面。

1.2、使用import 文件.模块的方式导入

在桌面创建demo.py文件,并把receiveMsg.py和sendMsg.py使用import文件.模块的方式导入demo.py文件。

receive.py模块

def receiveMessage():
print("正在接受消息...")

send.py模块

def sendMessage():
print("正在发送消息...")

demo.py模块

import msg.send
import msg.receive msg.send.sendMessage()
msg.receive.receiveMessage()

运行结果为:

正在发送消息...
正在接受消息...

1.3使用from文件夹import模块的方式导入

demo.py模块

from msg import *
send.sendMessage()
receive.receiveMessage()

运行结果为:

Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\deno.py", line 2, in <module>
send.sendMessage()
NameError: name 'send' is not defined

这个时候我们使用msg下面的模块失败,提示我们没有定义模块

1.4、在msg文件夹下创建 _ _init_ _.py 文件

1.5、在_ _init_ _.py文件中写入

__all__ = ["send","receive"]

1.6重新使用from文件夹import模块的方式导入

from msg import *
send.sendMessage()
receive.receiveMessage()

运行结果为:

正在发送消息...
正在接受消息...

总结:

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

二、_ _init_ _.py文件

  1. _ _init_ _.py控制着包导入行为
  2. _ _init_ _.py为空,意味着仅仅把这个包导入,不会导入包中的模块
  3. _ _init_ _.py文件中,定义一个_ _all_ _变量,它控制着from包名import*是导入的模块
  4. 可以在_ _init_ _.py文件中编写内容,当导入时,这些语句就会被执行

__init__.py模块

__all__ = ["send","receive"]
print("你导入的msg包")
def test():
print("这里是msg包里面的test")

demo.py模块

import msg
msg.test()

运行结果为:

你导入的msg包
这里是msg包里面的test

三、嵌套的包

假定我们的包的例子有如下的目录结构:

A/#包A
__init__.py
a1.py
sub_B/#包B
__init__.py
b1.py
b2.py
sub_C/#包C
__init__.py
c1.py
c2.py
sub_D/#包D
__init__.py
d1.py
d2.py

A是最顶层的包,sub_B等是它的子包,我们可以这样导入子包:

import A.sub_B.b1

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

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

from A import sub_B
sub_b.b2

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

from A.sub_B import b1

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

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

四、包发布

1.myModule目录结构体如下:

./
setup.py
__init__.py
test.py
sub_A/
__init__.py
a.py
sub_B/
__init__.py
b.py

2.编辑setup.py文件

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

from distutils.core import setup
setup(name = "Se7eN_HOU",version = "1.0",description = "Se7eN_HOU's module",author = "Se7eN_HOU",py_modules = ["sub_A.a","sub_B.b"])

3.构建模块

使用控制台在setup.py文件的同目录下执行python setup.py build

C:\Users\Se7eN_HOU\Desktop\myModule>python setup.py build
running build
running build_py
copying sub_A\a.py -> build\lib\sub_A
copying sub_B\b.py -> build\lib\sub_B C:\Users\Se7eN_HOU\Desktop\myModule>

构建后目录结构:

./
setup.py
__init__.py
test.py
sub_A/
__init__.py
a.py
sub_B/
__init__.py
b.py
build/
lib/
sub_A/
__init__.py
a.py
sub_B/
__init__.py
b.py

4.生成发布压缩包

同目录下执行python setup.py sdist

C:\Users\Se7eN_HOU\Desktop\myModule>python setup.py sdist
running sdist
running check
warning: check: missing required meta-data: url warning: check: missing meta-data: if 'author' supplied, 'author_email' must be supplied too warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list) warning: sdist: standard file not found: should have one of README, README.txt, README.rst writing manifest file 'MANIFEST'
creating Se7eN_HOU-1.0
creating Se7eN_HOU-1.0\sub_A
creating Se7eN_HOU-1.0\sub_B
making hard links in Se7eN_HOU-1.0...
hard linking setup.py -> Se7eN_HOU-1.0
hard linking sub_A\__init__.py -> Se7eN_HOU-1.0\sub_A
hard linking sub_A\a.py -> Se7eN_HOU-1.0\sub_A
hard linking sub_B\__init__.py -> Se7eN_HOU-1.0\sub_B
hard linking sub_B\b.py -> Se7eN_HOU-1.0\sub_B
creating dist
Creating tar archive
removing 'Se7eN_HOU-1.0' (and everything under it) C:\Users\Se7eN_HOU\Desktop\myModule>

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

./
setup.py
__init__.py
test.py
sub_A/
__init__.py
a.py
sub_B/
__init__.py
b.py
build/
lib/
sub_A/
__init__.py
a.py
sub_B/
__init__.py
b.py
MANIFEST
dist/
Se7eN_HOU-1.0.tar.gz

五、包的安装、使用

1、安装的方式

  1. 找到模块的压缩包
  2. 解压
  3. 进入文件夹
  4. 执行命令python setup.py install

注意:

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

2、模块的引入

在程序中,使用from import 即可完成对安装的模块使用

from 模块名 import 模块名或者*

六、循环导入

1. 什么是循环导⼊

A.py

from B import b
print("这是A模块")
def a():
print("hello a")
b() a()

B.py

from A import a
print("这是B模块")
def b():
print("Hello b")
a() b()

运⾏python a.py

Traceback (most recent call last):
File "C:\Users\Se7eN_HOU\Desktop\A.py", line 1, in <module>
from B import b
File "C:\Users\Se7eN_HOU\Desktop\B.py", line 1, in <module>
from A import a
File "C:\Users\Se7eN_HOU\Desktop\A.py", line 1, in <module>
from B import b
ImportError: cannot import name 'b' from 'B' (C:\Users\Se7eN_HOU\Desktop\B.py)

像这样A里面引用了B,B里面又引用了A,这样就叫做循环引用

2. 怎样避免循环导⼊

  • 1. 程序设计上分层,降低耦合
  • 2. 导⼊语句放在后⾯需要导⼊时再导⼊,例如放在函数体内导⼊

python高级-包(15)的更多相关文章

  1. 想拥有自己的Python程序包,你只需15步

    来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...

  2. python高级特性之封包与解包

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:kwsy PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  3. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  4. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)

    http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...

  5. 第八篇:python高级之多进程

    python高级之多进程   python高级之多进程 本节内容 多进程概念 Process类 进程间通讯 进程同步 进程池 1.多进程概念 multiprocessing is a package ...

  6. 第七篇: python高级之多线程

    21 interest=0.05 22 count=amount+amount*interest 23 24 self.withdraw(count) 25 26 27 def transfer(_f ...

  7. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  8. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  9. 老男孩Python高级全栈开发工程师【真正的全套完整无加密】

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师[真正的全套完整无加密] 课程大纲 老男孩python全栈,Python 全栈,Python教程,Django ...

随机推荐

  1. Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程

    一.在python程序中的进程操作 之前已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序 ...

  2. SpringBoot跨域问题

    1.先来说说跨域原理: 跨域原理简单来说就是发起跨域请求的时候,浏览器会对请求域返回的响应信息检查HTTP头,如果Access-Control-Allow-Origin包含了自身域,则允许访问,否则报 ...

  3. 20155312 张竞予 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 目录 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 实验总结与体会 实践过程记录 (1)简单应用SET工具建 ...

  4. adb安装apk

    1.    安装配置 1.1安装包 下载adb.zip,解压至本机 1.2环境配置 将adb安装路径加入path中 2.    安装apk 使用数据线将Android手机与电脑连接,打开手机usb调试 ...

  5. linux修改用户id,组id

    一.修改用户uid usermod -u foo 二.修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三.检查 cat /etc/passwd su ...

  6. Java Web服务器的联机交易

    我们知道服务器可以对外部的请求进行应答 ,在BS架构中,通过浏览器可以向Apache Tomcat或者WebSphere服务器发送请求.但是可能存在请求的渠道不是浏览器的情况,他有可能是另外一个jav ...

  7. 初学者必看的文章:在VM12中安装 RedHat RHEL7.2  系统的详细步骤:看我如何操纵RHEL系统

    一.开始安装 1)新建虚拟机 RHEL7.2 2)成功引导系统--开机出现此画面 Install Red Hat EnterpriseLinux 7.2  安装RHLE7.2 操作系统 Test th ...

  8. forms组件

    昨日回顾: 批量插入数据: -queryset的方法:bulk_create(对象列表,数字(一次插入多少)) 分页器: from django.core.paginator import Pagin ...

  9. python_flask 基础巩固 (URL_FOR 详解)

    URL_FOR 详解 url_for 通过 视图函数能够返回对应的url,url_for 有两个参数,endpoint(视图 函数)和关键字参数 url_for('my_list',page=2),多 ...

  10. npm Error: Cannot find module './auth.js'

    Mac 下升级 npm 到 v6.8.0 翻车. 提示: Error: Cannot find module './auth.js' 根据回显的报错路径,定位到这个文件中: npm/node_modu ...