Modules

对module的理解
和Java中一个类就是一个文件不同(当然不考虑内部类),python中一个.py文件可以包含多个class。Modules的目的是代码的划分、管理以及代码重用。一个module是一个包含了定义和代码的文件,个人认为module包含了针对功能的相关代码,在一个module中可以存在多个类、函数甚至是需要预执行的脚本。
compile&cache
为了加快加载速度python会缓存.py文件,在__pycache__指定的目录中缓存文件按照“module.version.pyc”的名称保存,其中version部分是python的版本信息,这样使得不同版本的缓存可以共存。在引入module时python会检查是否存在缓存和缓存版本是否过期。但是以下两种情况,python不会加载缓存文件:- command line中执行python时每次都会重新编译,不会尝试加载。
- 不存在源文件时,python不会直接从缓存中加载*.pyc文件。
dir
dir()是python中内置的命令返回一个字符串数组,可以用来查看一个module声明的名称。通过dir(module_name)查看一个module声明的名称,不提供参数的情况下会返回当前文件的声明信息。
作为脚本执行
module本身就可以作为python脚本执行,命令行中通过python module.py可以直接执行module,除此以外在import时如果被引入的module中有独立的代码(即不是class或者function的定义)也会被执行。如果希望只在作为独立脚本是被执行,可以写成如下:
1
2
|
if
__name__
=
=
'__main__'
:
print
(
'your code.'
)
|
Module的查找路径
python会通过两个地方查找被引入的module——builtins和sys.path。builtins是python内置的标准函数库,可能因不同的平台而有所不同,sys.path则分为项目目录和PYTHONPATH两部分。当一个module被引入时,python先查找builtins,如果没有找到则尝试在当前目录查找,如果仍然没有则查找PYTHONPATH也就是python的site-package目录。因此如果在项目目录中声明了和PYTHONPATH中同名的module,那么项目目录中的module会优先加载。
与package关系
python中的package就是代码在的目录路径,通过"."的表达式标识。在pythong中可以通过from aaa.bbb import ccc和import aaa.bbb.ccc或者fromaaa import bbb.ccc来达到引入ccc的目的,不同之处是import之后的内容在使用时需要提供全名称,也就是上述三种写法在使用时分别要调用:ccc.fun()、aaa.bbb.ccc.fun()、bbb.ccc.fun()。
package所在的目录需要包含一个空文件__init__.py来表明这个是一个python package,同时在__init__.py文件中可以声明一些描述性的代码来变更package的特性。比如针对import *的__all__,正常情况下我们写from aaa.bbb import *会引入位于aaa/bbb目录下的所有modules——这是一个不好的实践,因为有些东西可能会有副作用。特别的如果某个package下有你明确不希望被引用的py文件,可以通过__all__明确说明哪些是希望引入的,这样在python处理import *时会忽略掉不在__all__列表的内容。如下面的__init__.py指明了在import *时只有persons这个module会被引入。
1
2
|
__author__
=
'Administrator'
__all__
=
[
'persons'
,]
|
Pip

pip是用于安装PyPI中所列出的package的工具。PyPI即Python Package Index,是python提供的一个lib的在线仓库类似于Java的maven。pip的功能包括几方面:安装、卸载、升级、查看和本地安装、配置。
Install、List、Local Install、Search
pip用于安装package的命令install,使用命令pip install somepackage完成安装。一般情况下pip会选择最新的版本安装,可以通过参数version指定希望的package版本。除了单个package的安装pip还可以通过requirement file进行批量安装,命令:pip install -r requirement.txt。requirement file本身就是一个包含多个package列表文本文件,并且可以接受version等参数。使用requirement file的目的包括:
- 可重复安装,对于团队的生产环境需要安装统一的配置,可以直接用requirement file搞定。
- 解决依赖,pip默认安装最新的版本,但是多个package之间可能需要特定的版本来相互配合,可以把构建好的环境整理成requirement file。
- 安装特定的版本,比如新的版本可能引入了bug或者冲突,所以使用requirement file来指定一个版本。
- 自定义源文件的安装,软件中存在bug并且你已经等不及原作者去修复了。你自己修复后可以使用requirement file指定某一package从特定路径安装。
pip还支持wheel格式的安装,wheel是一种package的压缩格式要比通过源码的安装快速,默认情况下pip优先选择wheel格式安装,只有在无法找到wheel文件时才会从源文件安装。wheel是pip的一个模块,通过一下命令可以把源文件打包成wheel和从指定wheel文件安装package:
1
2
3
4
|
#打包
pip wheel
-
-
wheel
-
dir
=
/
your_wheel_directory
-
r requirement.txt
#安装
pip install
-
-
no
-
index
-
-
find
-
links
=
/
your_wheel_directory
-
r requirement.txt
|
1
2
3
4
|
#下载
pip install
-
-
download <
DIR
>
-
r requirements.txt
#安装
pip install
-
-
no
-
index
-
-
find
-
links
=
[
file
:
/
/
]<
DIR
>
-
r requirements.txt
|
1
2
3
4
5
6
|
#查看已经安装的package
pip
list
#查看过期的package
pip
list
-
-
outdated
#查看某个package的详细
pip show Django
|
Uninstall、Upgrade
需要删除一个package使用命令pip uninstall package_name即可,同样的需要升级一个package也可以通过命令pip upgrade package_name实现。需要注意的是pip的upgrade命令是递归的,也就是新版本的package所依赖的sub_package如果有新版也会被同时更新,即便现有的版本已经满足需求,不希望递归更新时使用命令:
1
2
|
pip install
-
-
upgrade
-
-
no
-
deps SomePackage
pip install SomePackage
|
Configuration
不同的操作系统平台pip的安装文件位置有所不同,Linux和MacOS中位于%HOME%/pip/pip.conf,Windows下位于%HOME/pip/pip.ini。pip的配置可以分为两个作用范围:整体和子命令。比如:
1
2
3
4
5
|
[global]
timeout = 60
[freeze]
timeout = 10
|
1
2
3
4
|
#设置环境变量
export
PIP_DEFAULT_TIMEOUT=60
#命令行参数
pip --default-timeout=60 [...]
|
- timeout:设置超时时间
- index-url:指定PyPI的基路径。
- find-links <url>:设置package所在的路径,如果url执行html文件那么解析这个文件,如果url是"file://"那么在url指定目录的文件列表里查找。
- no-index:忽略index,只在find-links时使用。
- ignore-installed:强制安装,即便已经安装了。
- no-deps:忽略依赖关系。