# 模塊
[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