[Jupyter]Anaconda環境配置
===
###### tags: `碩` `Anaconda` `jupyter` `notebook` `env`
###### 2022/02/20
:::info
### @Jupyterlab
* generate config file
* `$jupyter-lab --generate-config`
* The setting is same as [jupyter-notebook](#-jupyter-notebook)
* some cool things [here](https://kknews.cc/zh-tw/code/lmyoqne.html)
:::warning
`Jupyterlab` is a new version of `Jupyter notebook`.
`Jupyterhub` is encapsulated environments for multiple users. (This page will not bewrite more detailed)
:::
:::
###### 2018/08/31
> 此篇建立在已經安裝Anaconda環境下,正確的配置觀念建立
___
# 一、重要觀念
### 1. ***不可能*** 存在能夠符合所有套件的環境
* 儘管有,版本會受到非常大的限制
* 如 : 若要建立同時有`tensorflow-gpu`、`dlib`的環境,此時`dlib`會因為`tensorflow-gpu`套件的影響,變更為`19.4`版本,則使用`dlib`的`dlib.cnn_face_detection_model_v1()`函式時,就無法使用(版本要求 : `dlib 19.5`以上)
### 2. pip安裝、conda安裝差別
* `pip`安裝
* `pip`安裝快速方便,在安裝之前只需要檢查一下跟他相依的安裝包版本
* 安裝包來源來自[Python Package Index(PyPI)](https://pypi.org/)
* [conda](https://conda.io/docs/)安裝
* `conda`安裝之前會先評估所有套件的相依,並找到最符合的環境
* 安裝包來源來自各個第三方庫([anaconda cloud](https://anaconda.org/)、willyd、menpo、...)
* 綜合來說:
* `pip`適用於較單一的環境需求
* 如:僅需opencv、PIL、matplotlib之環境 用於影像處理,庫較不容易出現版本相衝問題
* `conda`適用於要做個個套件配合用,可以有效防止套件相依出現的版本衝撞
* 有的時候會使用`pip`安裝之後,在用`conda`將環境調整好
:::info
一般而言,最新的安裝包通常從PyPI會先有,anaconda cloud才有、作業系統的部分依序是ubuntu-linux、macOS、windows
:::
### 3. 並不是版本越高越好
* 這是一個比較不符大眾口味的想法,不是越新的東西越完整嗎?
* python3.7剛出的時候,很多資源都還沒有得到更新,很多的新手一看到就更新上去,結果那邊什麼都沒有,要退回來又很麻煩,最後只有卸載重裝一途
* opencv出到3之後,順道改了一兩個語法,但這樣一改,許多原本opencv2的套件和開源範例變得不能使用
* 如果有用過Xcode-Swift的人也一定知道,版本一更新,如果先鋒衝上去的話,有時還會遇到連官方文件都解釋不全的窘境
:::info
一個新版本的套件可能會遇到許多的小BUG,必須經過幾次的小改版後才會趨於穩定,所以要安裝套件不應該是要安裝最新的版本,反而應該先爬文看看再下手
:::
___
# 二、conda虛擬環境配置
> 從新手的角度,倒底要怎麼做才是最好的做法呢?既不能把所有環境都下載安裝,又不能胡亂的配置,又聽說很多人重裝了好幾次,甚至有時候會搞到連作業系統都重置,導致不敢繼續動作。
>
> 所以才必須介紹 : 虛擬環境
* conda 是一個管理各個packages(統稱安裝包)的管理系統,當初設計甚至是用於管理各個語言,同時也包含python,只是在開發R、python上有很大的方便。
* 以下先介紹幾個最基本的環境配置與法:
* `conda create -n <環境名稱> <安裝包1> <安裝包2> <...(以此類推)>`
* 建立一個名為<環境名稱>的新環境,預設有<安裝包1> <安裝包2> <...>
* 例 : conda create -n py36 conda python=3.6 ipykernel
* `conda env remove -n <環境名稱>`
* 刪除某環境
* 例 : conda env remove -n py36
* `conda info --envs`
* 檢視所有的環境
* `conda activate <環境名稱>`
* 當要變更或安裝配置該環境的時候,會先執行此行進入該環境,之後就是一般的conda install...或是pip install...
* 進入該環境後,命令行最左邊應該會出現<環境名稱>代表已經進去了
* `conda deactivate`
* 想要退出進入的環境時,可以下此命令退出
* 命令完成後,命令行最左邊應該會變回<base>等原本的字樣
:::warning
* 其想法有點像是你在anaconda中創立一個新的anaconda的環境
* 這樣的好處就在於,你可以快速創立一個量身訂製的環境去開發你的專案
* 對於新手使用而言,有時候不小心安裝錯誤、搞壞環境後,必須面臨的砍掉重練命運,此時只要conda env remove掉那個環境,並且重新conda create就可以了
:::
___
# 三、配置Jupyter notebook參數
### 進入Anaconda Prompt,執行:
```=
> jupyter notebook --generate-config
```
* 將產生`jupyter_notebook_config.py`檔案
* 如果是win10,應該會在"`C:\\Users\\<你自己>\\.jupyter`"裡面
### 1、任意使用者皆可使用
* 使用`jupyter notebook --ip='*'`
* 或是修改config.py中:
```python
## The IP address the notebook server will listen on.
c.NotebookApp.ip = '*'
```
* 若出現`KeyError: 'allow_remote_access'`則改成`0.0.0.0`
### 2、變更Jupyter notebook預設目錄
```python
## The directory to use for notebooks and kernels.
c.NotebookApp.notebook_dir = u'C:\\Program Files (x86)\\myproj\\proj1\\'
# 以上只是範例路徑 #
```
> 這邊要注意的是使用u開頭(unicode),並用兩條\代替原本路徑,主因歸根於python功能字元
:::info
若發現修改後仍無法改變路徑,需要右鍵`jupyter notebook捷徑`->內容->將`目標`中的最後一項`%USERPROFILE%`刪除
:::
### 3、設置jupyter notebook密碼
* 這邊必須注意,在config檔內紀錄密碼的並不是明碼,而是根據python notebook.auth.passwd() 函式加密後的結果,請依循步驟
```python=
>>> python #運行python
In [1]: from notebook.auth import passwd
In [2]: passwd() #他將會要你輸入兩次密碼
```
```python=
#如下為設置密碼 = 'testJupyter'之結果
Enter password: ········
Verify password: ········
Out[1]: 'sha1:63d9974d8a27:19727fb866c0c44be9458ba19b34efca13e62192'
```
> 之後便可以將其複製到config.py中
```python
# The string should be of the form type:salt:hashed-password.
c.NotebookApp.password = u'sha1:63d9974d8a27:19727fb866c0c44be9458ba19b34efca13e62192'
```
### 4、運行Jupyter notebook不要自動開啟視窗
```python
# configuration option.
c.NotebookApp.open_browser = False
```
### 5、設定port (預設: 8888) 遠端訪問時用到
```
## The port the notebook server will listen on.
c.NotebookApp.port = 8888
```
:::info
以上有些能直接指令更改,可以運行 > jupyter notebook --list 看看相關功能
:::
:::danger
如果無法遠端連線的疑難排解方法如下:
1. 確認能否 ping 到該電腦設備,假如 ping 得到代表 jupyter 設定有誤
2. 假如無法 ping 到,則是電腦防火牆或是網路安全相關設定將其擋下來
* Win10 可以透過`Windows Defender防火牆 -> 進階設定` 修改
:::
___
# 四、使用Jupyter-notebook在各個環境中轉換
:::success
這個非常的實用,也非常厲害
:::
### 1、安裝環境
> 這邊必須區分「母環境」和「子環境」,母環境就是<base>的環境底下,子環境就是經過create後,activate中的環境<環境名稱>,以下就以「母環境」和「子環境」作代稱
* (1) 母環境 安裝 nb_conda
```=
<base> conda install -c anaconda nb_conda
```
* (2) 所有子環境 安裝 ipykernel
```=
<子環境> conda install -c anaconda ipykernel
```
:::warning
tips: 這邊所有的子環境都要ipykernel,所以通常在建立子環境的時候就會先行安裝。如:
* conda create -n new_py conda python=3.7 ipykernel
:::
:::danger
子環境中,我們不需要安裝整個`anaconda`,而是只需要`conda`套件即可,所以安裝於仔環境中只需要`install conda`
:::
### 2、開啟Jupyter notebook
* 運行Jupyter notebook,可以直接點擊應用程式,或是運行命令「jupyter notebook」也可以
* 運行後若沒有出現式窗,可以打開瀏覽器,在網址輸入"http://localhost:8888/"請根據你的port改變數字
* 開啟後可以看到最上方有" conda "的 tab
* 
* 點進去可以看到你的各個子環境,這個介面可以讓你做pkgs的管理,也可以輕鬆產生子環境的環境配置檔案
* 回到Files tab,建立一個新的檔案
* 點擊'new'確認是否都有環境的選項
* 
### 3、在不同環境下執行程式
> 這個厲害就是厲害在,可以隨意變更不同環境
* 打開或創建任意檔案
* 可以在Kernel->Change kernel中任意轉換
* 
___
# 總結
> Q: 為什麼必要創建子環境呢?
> * 因為有時候根據專案需求,會需要不同的環境
>
> Q: 創建的子環境會不會對母環境造成影響啊?
> * 不會的,當你不小心失手了,可以輕易砍掉重練
>
> Q: 新的子環境這樣不是要耗費更多的記憶體空間嗎?
> * 沒錯,畢竟同樣的安裝包都需要再被重新安裝,但與此相對,其不只可以保護你好不容易建立好的環境以外,可以更加客製化的開發專案,不會讓原本的母環境看起來又笨又重、還帶許多傷疤
:::success
虛擬環境並不是人人都需要,要認真說也不是必要,畢竟conda這套管理套件要讓你裝到相依套件互相衝突本來就要一定的套件數量和版本新舊度,但儘管如此,conda本身還是有一些補償措施,如:同時裝上不同版本套件,遇到某情況下引入哪個版本,但這只是會顯得很多傷疤,哪天不能用也不意外。
:::
* 更多jupyter進階用法可以參考[28 Jupyter Notebook Tips, Tricks, and Shortcuts](https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/)