---
# System prepended metadata

title: Python Package & Module
tags: [' module', python, ' package']

---

---
title: Python Package & Module
tags: python, module, package
---

[TOC]

---
# Module Note Links
## Builtin Module
- [Module - ArgParse](https://hackmd.io/OcBCKOFwReyTgALyDFjdRw?view)
- [Module - CSV](https://hackmd.io/@YouSheng/Bk8N8B0O_)
- [Module - Ftplib](https://hackmd.io/@YouSheng/HJr2WAbCI)
- [Module - Hashlib](https://hackmd.io/@YouSheng/BkvOOHAOO)
- [Module - JSON](https://hackmd.io/@YouSheng/Bk4eIPBDO)
- [Module - Logging](https://hackmd.io/@YouSheng/SyElMHNdO)
- [Module - OS](https://hackmd.io/@YouSheng/SkexvBAuO)
- [Module - Queue](https://hackmd.io/@YouSheng/S1lsYI7WF)
- [Module - Random](https://hackmd.io/@YouSheng/HkBkUrA_u)
- [Module - Requests](https://hackmd.io/@YouSheng/S14CMCeY_)
- [Module - Socket](https://hackmd.io/@YouSheng/Hyk0nlDID)
- [Module - SSL](https://hackmd.io/@YouSheng/ryl1DWWtO)
- [Module - SYS](https://hackmd.io/@YouSheng/SkSgwBAud)
- [Module - Time & DateTime](https://hackmd.io/@YouSheng/HyU5Ur0dO)
- [Module - Tkinter](https://hackmd.io/@YouSheng/H1dlhcsMu)
- [Module - Threading](https://hackmd.io/@YouSheng/HJIkx7bF_)
- [Module - Unittest](https://hackmd.io/@YouSheng/SJdGtiQ9O)
- [Module - Urllib](https://hackmd.io/@YouSheng/SyYVsJf0U)

## Thrid Party Module
- [Module - Bs4](https://hackmd.io/@YouSheng/SkTkOkf0L)
- [Module - Curses](https://hackmd.io/@YouSheng/Hy8yTH0uu)
- [Module - Email & SmtpLib](https://hackmd.io/@YouSheng/Syjj3rROd)
- [Module - Numpy](https://hackmd.io/@YouSheng/ryYvfc_n8)
- [Module - Openpyxl](https://hackmd.io/@YouSheng/SJ0N1_PpI)
- [Module - Pandas](https://hackmd.io/@YouSheng/S14aCvDp8)
- [Module - Psutil](https://hackmd.io/@YouSheng/B1BvfSiFu)
- [Module - PyperClip](https://hackmd.io/@YouSheng/SJRudBAud)
- [Module - PyAutoGUI](https://hackmd.io/@YouSheng/HyU5iSAdu)
- [Module - Selenium](https://hackmd.io/@YouSheng/Bk1dhB5Ku)


---

# Module Concept
:::success
C/C++ 編譯過後的 Object Code 也可以當成 Python Module
- 兩者使用的方式完全相同
- 若發現使用 Python 撰寫效率很差，可以試著用 C/C++ 改寫 Module
:::
```python=
import <module name>
<module name>.<class or fun or global value>
```
- 模組名稱就是檔案的主檔名
- 第一次 Import Module 時，若一切正常沒有錯誤，Python 則會將 Source Code 編譯成 Python Byte Code，存放在模組同一資料夾底下，以 `<module name>.pyc` 儲存。
    - 之後使用若 Source Code 沒有變更，就會直接執行 `.pyc` 檔，增加執行效率。

## ReImport Module
- import statment 會檢查模組是否已經被載入，所以**重複執行 import 不會再次從檔案 import module**
- 若要在程式執行到一半或是在 Interactive Mode 中 ReImport Module，使用
```python=
import importlib, random
importlib.reload(random)
```

## Three Type of Import
```python=
# 1. Basic Type
import <module name>

# 2. Import object repectively
from <module name> import object1, object2, ...

# 3. Alias
import <module name> as <alias>
```
- Import All 好用但不建議用
    - 不會 import `_` 開頭的物件
    - 若被 import 的模組內有 `__all__` 的 List，在執行 `import *` 就會照 `__all__` 的規則 import 物件
    - 在函式內可以使用 import 來匯入模組，但**不能使用 `from <module name> import *`**
```python=
from <module name> import *
```

## Module Search Path
- 空字串代表**當前目錄**
- 執行 Python 程式時，該程式所在的目錄會被放在 `sys.path` 變數的第一個位置
    - 將主程式與模組放在同一個目錄可優先被搜尋到
```python=
import sys
sys.path

['', '/usr/lib/python36.zip', 
'/usr/lib/python3.6', 
'/usr/lib/python3.6/lib-dynload', '/home/johnson/.local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/dist-packages',
'/usr/lib/python3/dist-packages']
```

---
# NameSpace
## Three NameSpace
1. builtin
2. global
3. local

---
# Package
- Package 是一個包含 Python Source Code 的目錄。
    - 通常 Package 中包含一組相關的程式檔案 (模組)
    - 套件的名稱即**最上層目錄的名稱**
- `__init__.py`
    - 當 import package 時會先執行該檔案
    - 該檔案通常會針對 package 進行初始化的動作，例如先 import 其他需要的 package

