[编程经验] Python中的modlue和packages的区别

今天聊一下,Python中模块和包的区别和联系,以及怎么创建自己的package,通过学习,你可以明白我们平时用Python的时候,到底import 了什么东西。我尽量讲的详细一点,大神可以点左上角X。

下面可以先照着我说的做一遍,做完之后,我再解释。

首先打开Pycharm(没用过的可以先百度安装,很简单),左上角点

File--> New Project

然后这里随便取个名字,我这里叫做 packages_demo

其实这里说随便,其实不管是什么编程语言,文件,函数的命名都是有讲究的,尽量取的能代表你要做的事情,增加代码易读性。

然后右键刚才新建的包的,选择Python File,取名为setup.py

然后再点我们工程名字,选择Directory,新建两个文件夹, 一个取名为packages_demo。另一个叫demo。

然后再packages_demo文件夹下面,新建两个Python File,一个叫 __init__.py, 一个叫 __version__.py。顺便再建一个Python File 叫firsrt.py 。另外在demo文件夹下新建一个Python File 叫做outer.py。

好,现在我们的工程结构是这样的:

好,先停一下,我们讲一下细节。

刚开始学Python的时候,可能你是在Python Shell 里面敲了一个print("Hello World !")

后来你也可能也会在Shell里面写个函数。但是等你关掉Shell 的时候,你写的代码就没了,也就是没有保存起来,问题就来了,写的代码都没保存,那后面想用的时候就没法用。

所以你会在Shell里面选择新建文件,然后保存,命名为demo.py。 然后这时候就可以在Shell里面import 进来你写的demo 包了,这个包就是Python中的module,Python中的包包括内置的包和第三方包,内置的包不需要安装,第三方包需要手动安装,而一般的包都可以通过pip来安装,那我怎么知道,那些可以用pip,那些不可以用pip呢? 你安装一下,安装成功了,就说明可以啊。。。

另外一种安装方式就是下载包的源代码,然后执行 python setup.py install , 同样也可以安装,还有些包有.whl后缀的文件,这个也可以直接pip xxx.whl install 运行安装, whl其实是已经编译好的pyd文件,这样在本地安装的时候就不需要编译,pyd文件是怎么产生的? 是我们在编译.py文件的时候,Python解释器自动生成的。

关于Python包还有一个需要掌握的就是 下面这个

if __name__ == "__main__"

这一句是什么意思? 当我们在Shell里面import demo,并计算1,2的和的时候,下面那句并没有输出。然后我们Ctrl+F5,执行demo.py文件,他输出结果:

这就说明,if __name__ == "__main__"的作用就是说,下面的代码只有在直接执行demo.py时才运行,而import 的时候是不执行的。

好,为了让大家彻底理解,我我们在demo.py中加入一句,print(__name__)

然后在Shell里面import demo 出现结果为demo。 然后调用demo的__name__方法。输出也是demo。

然后直接运行demo.py,显式的名字为 __main__,这你就明白了吧。。

到这,关于module 需要了解的就这么多了,最后说一下,Python中的双下划线开头表示的是特殊方法名。也就是说,name是Python中的一个特殊方法,所以加了双下划线。

我们用dir()方法可以查看demo这个module下面都定义了哪些方法

可以看到这里除了add以外,还有几个特殊方法,这个特殊方法,是Python预定义好的。

然后,注意一下,里面有个__package__的特殊方法,调用一下

结果显示为空,也就说它没有package,其实这里也可以看出来,package是比module高一级的东西。

package在Python中的意思就是多个module组成起来就是package了。

关于package有两点需要注意的,一是每个package下面需要包含 __init__.py文件,二是package的好处在于方便代码管理和避免命名冲突。

好,然后我们回到开始让大家新建的文件。其实就是新建了一个工程,在工程下面新建一个packages和一个module, 一个叫package_demo,一个叫demo。然后我们在first.py和outer.py下面随便写一点代码:

first.py

print("This is first modlue")


def fun(x):
    return x * 2

outer.py

from packages_demo import first


def fun():
    return first.fun(x=3)

if __name__ == "__main__":
    results = fun()
    print(results)

然后看一下,setup.py 这个文件,这里要介绍的是setuptools这和包,这是一个Python自带的包管理工具,可以编译,安装,管理Python的包。下面是一个简单的demo展示,代码很少,这样就可以创建一个我们自己的package了。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from setuptools import find_packages, setup

NAME = 'packages_demo'

setup(
    name=NAME,
    version="0.0.1",
    packages=find_packages()
)

然后我们打开Pycharm下面的Terminal命令行,执行python setup.py install.

这样我们就安装了一个自己写的package。是不是很帅?

安装完之后,文件夹下面多了这个三个文件夹,这个就是编译好的Python的包

然后我们也可以在我们的Shell里面直接调用了,这就表明,我们已经封装好了一个Python的package,这个packages_demo就和平时用的os, sys, pandas等等包的原理没有区别。

至此,Python中module和package的区别和联系就介绍完了,回顾一下我们主要讲的有什么是module及注意的地方,什么是package,如何创建自己的package,以及怎么安装。

好了,今天到这里了,有不懂的可以问我~

原文发布于微信公众号 - 机器学习和数学(ML_And_Maths)

原文发表时间:2018-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

Makefile教程

Makefile定义了软件开发过程中,项目工程编译链、链接的方法和规则。 由IDE自动生成或者开发者手动书写。 Unix(MAC OS、Solaris)和Lin...

44520
来自专栏小勇DW3

使用Redis作为分布式锁的一些注意点

最简单的方法是使用setnx命令。key是锁的唯一标识,按业务来决定命名,value为当前线程的线程ID。

3.5K50
来自专栏JavaEdge

深入使用XMemcached1 XMemcached介绍和环境构建2 构建MemcachedClient对象12 初探Memcached分布式原理14 余数Hash算法15 一致性 Hash 算法16

18630
来自专栏磨磨谈

Cephfs的文件存到哪里了

在ceph里面使用rbd接口的时候,存储的数据在后台是以固定的prifix的对象存在的,这样就能根据相同的前缀对象去对image文件进行拼接或者修复

17130
来自专栏专注 Java 基础分享

初识Hibernate之理解持久化类

     上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射...

20980
来自专栏xingoo, 一个梦想做发明家的程序员

[Logstash-input-redis] 使用详解

redis插件的完整配置 input { redis { batch_count => 1 #返回的事件数量,此属性仅在list模式下起...

452100
来自专栏北京马哥教育

Ansible 详细用法说明(二)

例:获取某台主机的变量 ansible 10.1.6.68 -m setup ===================================== sc...

39850
来自专栏林欣哲

区块链开发之Go语言—文件系统

处理的文件名 path库 filepath库 查看文件的元信息 os.Stat os.Lstat 操作临时文件区域 os.TempDir os — 平台无关的操...

39880
来自专栏皮振伟的专栏

[nptl][rwlock]pthread rwlock原理分析

概念: In computer science, a readers–writer (RW) or shared-exclusive lock (also kn...

53270
来自专栏静默虚空的博客

Ant 简易教程

前言 Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。...

250100

扫码关注云+社区

领取腾讯云代金券