# 模块
[TOC]
## 模块定义
1. 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
2. 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,**检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。**
```
mycompany # 包名,防止模块名冲突
├─ web
│ ├─ __init__.py # 表示该目录为一个模块包,而不是普通目录,该本身就是一个模块,而它的模块名就是mycompany,内容可以为空。
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ xyz.py
```
## 使用模块
### 编写hello模块
**hello.py**
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'jason Zhou'
import sys
def test():
args = sys.argv
print(args) # list所有的命令行参数
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
# 前面_的为私有函数,不应该在外部被引用
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
# 当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败。
if __name__=='__main__':
test()
```
### 使用hello模块
mymodule
│ ├─ __init__.py
│ ├─ hello.py
│ └─ xyz.py
└─ index.py
```python
import mymodule.hello
mymodule.hello.test();
# 导入多个模块
import module1,module2
# 使用别名
import mymodule.hello as hello
hello.test();
# 从模块中导入一个指定的部分到当前命名空间中
from fib import fibonacci # 导入模块 fib 的 fibonacci 函数,也可以用','导入多个函数
# 把一个模块的所有内容全都导入到当前的命名空间
from math import * # 一次性引入 math 模块中所有的东西,不建议用
# 访问文档注释
hello.__doc__
```
## 测试代码
```python
if __name__ == '__main__':
print('命令行执行才调用')
__all__ = ['这里面放当前模块可被调用的方法']
```
## 第三方库
一般来说,第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索,比如Pillow的名称叫Pillow,因此,安装Pillow的命令就是:
```bash
pip install Pillow
```
## 模块搜索路径
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中, 如果我们要添加自己的搜索目录,有两种方法:
1. 直接修改sys.path,添加要搜索的目录:
2. 设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
## 其他
1. 在python2中包要有__init__.py
## 模块发布与模块安装
https://app.yinxiang.com/shard/s12/nl/1992144/d6034627-25cf-47a4-81cc-5a9e3cd9b951