python里面模块和包的区别是什么?

首发于公众号:Python编程时光

以上仅介绍了 easy_install 的一些常用的方法,想要了解更多,你可以点击官方文档:

总结一句:setuptools 是官方提供的一个专业用于包分发的工具,若只从安装的角度来看,它的功能确实简单。它更大的意义是对包的分发很有用,定制化程序非常高,我们现在也还在用它进行版本包的发布。

ext_modules 参数用于构建 C 和 C++ 扩展扩展包。其是 Extension 实例的列表,每一个 Extension 实例描述了一个独立的扩展模块,扩展模块可以设置扩展包名,头文件、源文件、链接库及其路径、宏定义和编辑参数等。如:

setup.py 的参数非常多,能够不借助文档写好一个setup.py好像没那么简单。为了备忘,我整理了 setup 函数常用的一些参数:

8. 打包辅助神器PBR 是什么?

pbr 会读取和过滤setup.cfg中的数据,然后将解析后的数据提供给 setup.py 作为参数。包含如下功能:

到此,我讲了三种编写使用 setup.py 的方法

  • 使用命令行参数指定,一个一个将参数传递进去(极不推荐)
  • 使用 pbr ,在 setup.cfg 中指定(易于管理,更推荐)

使用 sdist 将根据当前平台创建默认格式的存档。在类 Unix 平台上,将创建后缀后为 .tar.gz 的 gzip 压缩的tar文件分发包,而在Windows上为 ZIP 文件。

当然,你也可以通过指定你要的发布包格式来打破这个默认行为

你可以指定的格式有哪些呢?

创建一个压缩的tarball和一个zip文件。可用格式为:

对以上的格式,有几点需要注意一下:

  • 在版本3.5中才添加了对 xztar 格式的支持
  • zip 格式需要你事先已安装相应的模块:zip程序或zipfile模块(已成为Python的标准库)
  • ztar 格式正在弃用,请尽量不要使用

另外,如果您希望归档文件的所有文件归root拥有,可以这样指定

2、构建二进制分发包。

在windows中我们习惯了双击 exe 进行软件的安装,Python 模块的安装也同样支持 打包成 exe 这样的二进制软件包。

而在 Linux 中,大家也习惯了使用 rpm 来安装包,对此你可以使用这条命令实现 rpm 包的构建

若你的项目,需要安装多个平台下,既有 Windows 也有 Linux,按照上面的方法,多种格式我们要执行多次命令,为了方便,你可以一步到位,执行如下这条命令,即可生成多个格式的进制包

正常情况下,我们都是通过以上构建的源码包或者二进制包进行模块的安装。

但在编写 setup.py 的过程中,可能不能一步到位,需要多次调试,这时候如何测试自己写的 setup.py 文件是可用的呢?

这时候你可以使用这条命令,它会将你的模块安装至系统全局环境中

如若你的项目还处于开发阶段,频繁的安装模块,也是一个麻烦事。

这时候你可以使用这条命令安装,该方法不会真正的安装包,而是在系统环境中创建一个软链接指向包实际所在目录。这边在修改包之后不用再安装就能生效,便于调试。

通过上面的学习,你一定已经学会了如何打包自己的项目,若你觉得自己开发的模块非常不错,想要 share 给其他人使用,你可以将其上传到 PyPi (Python Package Index)上,它是 Python 官方维护的第三方包仓库,用于统一存储和管理开发者发布的 Python 包。

如果要发布自己的包,需要先到 pypi 上注册账号。然后创建 ~/.pypirc 文件,此文件中配置 PyPI 访问地址和账号。如的.pypirc文件内容请根据自己的账号来修改。

然后使用这条命令进行信息注册,完成后,你可以在 PyPi 上看到项目信息。

注册完了后,你还要上传源码包,别人才使用下载安装

或者也可以使用 twine 工具注册上传,它是一个专门用于与 pypi 进行交互的工具,详情可以参考官网:,这里不详细讲了。

}

Python的流行主要依赖于其有众多强大的功能,其自带的标准库(Standard Library)可以满足大多数的基本需求,除了函数库以外,模块(Module)和包(Package)也常会被提及。其中库、模块和包常常会分不清,本篇对这些做个区分。

1.1 什么是模块模块(module)是一个包含Python定义和语句的文件,也就是一个.py文件就可以称为一个模块。


通过使用模块,不仅可以有效地避免命名空间的冲突,还可以将一个较大的程序分为多个文件,提升代码的可维护性和可重用性。
比如下面的一个脚本calc_distance.py,计算球面两点间的距离就可以是一个模块。模块名就是文件名(calc_distance)。

1.2 如何调用模块如果其他脚本需要调用上述模块,常见的方式如下:

1.3 __name__ 的作用__name__是一个全局变量,不同场景下它的值是不一样的。(1)当模块作为脚本被直接运行的时候,__name__变量的值为"__main__";(2)当模块被其他脚本import调用时,该变量为模块文件名,也即__name__=="calc_distance";
一般我们编写一个模块时,都会进行一些测试,会大量输出的测试信息,而当模块被别的脚本调用执行时,这些测试信息输出是累赘的。利用__name__这个变量的特点,模块的测试就放在if __name__ == "__main__":之后,这样执行脚本本身测试信息正常输出,而别的脚本调用时则不会运行这些测试内容,也就不会输出测试的信息了。

1.4 说明文档模块的说明文档放在py文件的开头,用成对的三个英文单引号引起来,通过以下方式获取模块的说明文档。


1.5 模块的路径用import语句导入的模块,Python会按照下列路径依次寻找目标模块:(1)当前的工作目录;(2)PYTHONPATH(这是一个环境变量)中的所有目录;(3)Python 默认的安装目录。

模块一般就是我们日常随手用的一些规模较小的代码,而在比较大规模的任务一般需要用到大量的模块,此时我们可以使用包(Package)来管理这些模块。我们平时下载的第三方包也就是这个,如Numpy,
什么是包?包,就是里面装了一个__init__.py文件的文件夹。__init__.py脚本有下列性质:(1)它本身是一个模块;(2)模块名不是__init__,而是包的名字,也就是装着__init__.py文件的文件夹名。(3)它的作用是将一个文件夹变为一个Python模块(4)它可以不包含代码,不过一般会包含一些Python初始化代码(例如批量导入需要的模块),在这个包被import的时候,这些代码会自动被执行。
2.2 导入包导入包的方法和导入模块比较类似,只不过由于层级比一般模块多了一级,所以多了一条导入形式.

python库(library)的概念,网上搜到的信息也五花八门,没有一个统一的概念,主要总结为两种观点:
观点1:严格来说Python中是没有库(library)的概念,模块(module)和包(package)都是Python语法中有的概念,Python中的库是借用其他编程语言的概念,没有特别具体的定义,只是一个通俗的说法,平时说的库既可以是一个模块也可以是一个包。

观点2:从大到小的层级关系:库->包->模块。库是指具有相关功能模块的集合,是一个完整的东西,可以认为库是一个完整的项目打包,可直接调用或者运行,一个库中可能有多个包。

搜索到的答案中,大部分倾向于第一种观点。

最后总结就是:模块module:一个 .py 文件就是个模块,由函数和类组成;包package:多个模块放在一个文件夹,就是一个包;
库library:只是一个通俗的说法,平时说的库既可以是一个模块也可以是一个包。


}

pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢

1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了。

当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件。

2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文件__init__.py 的目录,而__init__.py 文件定义了包的属性和方法。

其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果__init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

补充知识:Python类、模块、包的区别

类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。

模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者名字空间,可将module_name 理解为名字限定符。模块名就是文件名去掉.py后缀。

 
 

模块属性__name__,它的值由Python解释器设定。如果脚本文件是作为主程序调用,其值就设为__main__,如果是作为模块被其他文件导入,它的值就是其文件名。

每个模块都有自己的私有符号表,所有定义在模块里面的函数把它当做全局符号表使用。

模块可以导入其他的模块。通常将import语句放在模块的开头,被导入的模块名字放在导入它的模块的符号表中。

from module import names 可以直接从模块中导入名字到符号表,但模块名字不会被导入。

from module import * 可以把模块中的所有名字全部导入,除了那些以下划线开头的名字符号。不建议使用,不清楚导入了什么符号,有可能覆盖自己定义的东西

内建函数dir()可以查看模块定义了什么名字(包括变量名,模块名,函数名等):dir(模块名),没有参数时返回所有当前定义的名字

当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)

sys.path的初始值来自于以下地方:

包含脚本当前的路径,当前路径

sys.path初始化完成之后可以更改

上面的例子中,当client被导入后,python解释器就在当前目录下寻找client.py的文件,然后再从环境变量PYTHONPATH寻找,如果这环境变量没有设定,也不要紧,解释器还会在安装预先设定的的一些目录寻找。这就是在导入下面这些标准模块,一切美好事情能发生的原因。

这些搜索目录可在运行时动态改变,比如将module1.py不放在当前目录,而放在一个冷僻的角落里。这里你就需要通过某种途径,如sys.path,来告知Python了。sys.path返回的是模块搜索列表,通过前后的输出对比和代码,应能理悟到如何增加新路径的方法了吧。非常简单,就是使用list的append()或insert()增加新的目录。


  

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 _init_.py。然后是一些模块文件和子目录,假如子目录中也有 _init_.py 那么它就是这个包的子包了。

在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。_init_.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from

可以从包中导入单独的模块。

当使用from package import item时,item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)

首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。

当使用import item.subitem.subsubitem语法时,最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量

如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。

如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。

包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。

通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。

引入某一特定路径下的模块

将一个路径加入到python系统路径下,避免每次通过代码指定路径

多次import不会多次执行模块,只会执行一次。可以使用reload来强制运行模块,但不提倡。

为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py文件。常见的包结构如下:

 

以上这篇浅谈Python中文件夹和python package包的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

}

我要回帖

更多关于 python模块大全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信