---
# System prepended metadata

title: 虛擬環境＆requirements.txt

---

🫧 虛擬環境 ＆ requirements.txt
===

## 看自己的套件版本

### 1. `pip list`
```
pip list
```
會列出所有pip install的套件及其版本，會長這樣：

```
Package    Version
---------- -------
numpy      1.21.0
pandas     1.3.0
requests   2.25.1
```

### 2. `pip freeze`
```
pip freeze
```
一樣是列出所有pip install的套件及其版本，但列出的格式不一樣，會用這個格式做成`requirement.txt`：

```
numpy==1.21.0
pandas==1.3.0
requests==2.25.1
```

### 3. `pip show <package_name>`
```
pip show requests
```
想查看特定套件的詳細資訊（如版本、安裝路徑、依賴等）：

```
Name: requests
Version: 2.25.1
Summary: Python HTTP for Humans.
Location: /usr/local/lib/python3.9/site-packages
Requires: certifi, chardet, idna, urllib3
```

### 4. 在 Python 裡面看
```
import requests
print(requests.__version__)
```
import你想查看的特定套件，然後印出他的版本資訊：

```
2.25.1
```

## what is 'requirements.txt'

`requirements.txt` 是一個用來列出 Python 專案所依賴的第三方套件及其版本的檔案。通常會長這樣：
```
#套件名  #版本
numpy==1.21.0
pandas>=1.3.0
requests==2.25.1
```
- 指定固定版本：requests==2.25.1
- 指定最低版本：flask>=1.1.2
- 指定兼容版本：numpy~=1.19.2（會安裝 1.19.x 中的最新版本）


因為一個python專案，會需要用到不同的套件，可能也會倚賴不同的版本。如果我們要與與他人一起共同編輯一個python 專案，或是上網抓人家的code來用，透過`requirements.txt` 我們可以：
- 快速給別人我們在這個python專案使用的套件版本資訊
- 快速抓取別人在這個python專案所需要使用的套件版本資訊

==工具箱一把抓的概念==

- 要先去指定的地方（哪一個目錄底下）
- 名字不一定要叫`requirements.txt` 但這算是一個約定俗成的名字啦

### 生成自己的 `requirements.txt`
```
pip freeze > requirements.txt
```
### 安裝別人的 `requirements.txt`
```
pip install -r requirements.txt
```
### 查看清單內容
```
cat requirements.txt   # Mac/Linux
type requirements.txt  # Windows
```



## 虛擬環境

Python 環境是指在電腦系統中安裝和配置好的 Python 運行環境，這包括 Python 解譯器 ( interpreter )、標準函式庫、第三方套件、環境變數設定、和相關工具。

Python 環境可以是全域環境，如安裝在系統上的 Python，可以在整個系統中使用，也可以是虛擬環境 ( virtual environment )，它是一個獨立的環境，允許在其中安裝不同版本的 Python 和相關套件。

### 使用虛擬環境的好處：

- 避免了版本衝突：每個Python專案可能需要使用不同版本的套件，虛擬環境可以將每個專案的依賴關係隔離開，獨立安裝不同版本的 Python 和相關套件。
- 保持環境乾淨：在全域環境中安裝大量的套件可能會讓環境變得混亂且難以管理，使用虛擬環境可以只安裝專案所需的套件。

### 安裝虛擬環境有很多不同的方法：
- `venv`
- `virtualenv`
- `pipenv`
- `pyenv`
- `conda`

這裡會介紹前三個

### 1. `venv`
- 簡單輕量，適合小型項目
- python3.3開始提供
- 無法管理不同的python版本 i.e., 如果本機是python 3.7 就不能創造python 3.8的虛擬環境
```
python -m venv myenv #可以自己取名稱
source myenv/bin/activate  # Linux/Mac
myenv\Scripts\activate     # Windows
```
#### 退出虛擬環境
```
deactivate # Windows & Linux/Mac
```

#### 刪除虛擬環境

```
rm -rf myenv    # Linux/Mac
rd /s /q myenv  # Windows
```

### 2. `virtualenv`
- 需要先安裝 `pip install virtualenv`
- 功能和`venv` 差不多，但是支援到 python 2
- 一樣無法管理不同的python版本

```
virtualenv myenv #可以自己取名稱
source myenv/bin/activate  # Linux/Mac
myenv\Scripts\activate     # Windows
```
#### 退出虛擬環境
```
deactivate # Windows & Linux/Mac
```

#### 刪除虛擬環境

```
rm -rf myenv    # Linux/Mac
rd /s /q myenv  # Windows
```


### 3. `pipenv`
- 需先安裝 `pip install pipenv`
- 現在官方推薦的工具！結合了 `pip` 和 `virtualenv` 的功能。
- 僅能使用系統已安裝版本
- 適合中大型項目，需要穩定依賴和版本管理的團隊開發

#### 初始化環境的python版本
```
pipenv --three                  # 指定python 3環境
pipenv --two                    # 指定python 2環境
pipenv install --python 3.10    # 指定明確版本
```
#### 安裝/解除套件
```
pipenv install requests
pipenv uninstall requests
```
#### 顯示套件
```
pipenv graph
```


#### 執行程式碼
1. 直接執行
```
pipenv run python test.py
```
2. 先進入虛擬環境再執行
```
pipenv shell
python test.py
```

#### 退出虛擬環境
```
exit
```

#### 移除虛擬環境

```
pipenv --rm
```

#### 儲存版本資訊的檔案

1. `cat Pipfile`

```
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = "3.5"
```
- ``[packages]`` 是本專案正式要用到的套件
- ``[dev-packages]`` 是開發中的套件，安裝方法要加`-d`
`pipenv install requests==2.18.0 -d`
- ``[requires]`` 是python版本



2. `cat Pipfile.lock`

```
{
    "_meta": {
        "hash": {
            "sha256": "abcd1234efgh5678ijkl91011mnopqrstuvwx"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.8"
        }
    },
    "default": {
        "flask": {
            "version": "==2.1.1",
            "hashes": [
                "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
            ]
        },
        "requests": {
            "version": "==2.28.1",
            "hashes": [
                "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
            ]
        }
    },
    "dev": {
        "pytest": {
            "version": "==7.3.1",
            "hashes": [
                "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
            ]
        }
    }
}

```
- 會顯示依賴套件
- 儲存最精確的版本



#### 當需要與他人配合用一樣的套件版本時
1. 使用 `requirements.txt`

```
pipenv shell    # 先進去虛擬環境
pip freeze > requirements.txt    # 輸出
pip install -r requirements.txt  # 讀取
```
2. 使用 `Pipfile.lock`
```
pipenv lock      # 輸出
pipenv install   # 讀取
```
---
## Referneces
1. [【程式工具】5種自動儲存python requirements.txt方法](https://mattdataadventures.com/save_requirements_txt_file/)
2. [給自己的Python小筆記 — 解決環境套件安裝與版本問題，開始建立一個乾淨的環境 — 如何建立虛擬環境 — env 和 virtualenv 套件教學 — Windows系統](https://chwang12341.medium.com/%E7%B5%A6%E8%87%AA%E5%B7%B1%E7%9A%84python%E5%B0%8F%E7%AD%86%E8%A8%98-%E8%A7%A3%E6%B1%BA%E7%92%B0%E5%A2%83%E5%A5%97%E4%BB%B6%E5%AE%89%E8%A3%9D%E8%88%87%E7%89%88%E6%9C%AC%E5%95%8F%E9%A1%8C-%E9%96%8B%E5%A7%8B%E5%BB%BA%E7%AB%8B%E4%B8%80%E5%80%8B%E4%B9%BE%E6%B7%A8%E7%9A%84%E7%92%B0%E5%A2%83-%E5%A6%82%E4%BD%95%E5%BB%BA%E7%AB%8B%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83-env-%E5%92%8C-virtualenv-%E5%A5%97%E4%BB%B6%E6%95%99%E5%AD%B8-windows%E7%B3%BB%E7%B5%B1-b973e53ff80)
3. [Python 的 Virtualenv 虛擬環境安裝與使用](https://medium.com/ai-for-k12/python-%E7%9A%84-virtualenv-%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83%E5%AE%89%E8%A3%9D%E8%88%87%E4%BD%BF%E7%94%A8-8645f5884aac)
4. [[Day 15] Python - 虛擬環境 ( pipenv )](https://ithelp.ithome.com.tw/articles/10301302)
5. [Python 教學 1 – 環境架設 ( pyenv ) 與 Python 簡介](https://jimmyswebnote.com/python-tutorial-pyenv/)
6. [Python 工具箱 (1) — 專案必備 Pipenv](https://medium.com/citycoddee/python-%E5%B7%A5%E5%85%B7%E7%AE%B1-1-%E5%B0%88%E6%A1%88%E5%BF%85%E5%82%99-pipenv-a517e292f6c)
7. [【教學】手把手的pipenv教學](https://www.dephilia.moe/posts/pipenv/#pipenv%E5%81%9A%E4%BA%86%E4%BB%80%E9%BA%BC)