2025年8月22日 星期五

Python 學習筆記 : 將 K 線圖模組 kbar.py 打包上傳 PyPI (五)

完成前面幾篇測試, 確認新版 kbar v0.1.2 可在 Windows/Colab/Linux 平台上從 TestPyPI 網站順利安裝, 並且成功地顯示有中文的 K 線圖後, 就來到本系列測試的末篇 : 正式將 kbar 發佈到 PyPI 網站, 讓使用者直接用 pip install kbar 就能安裝此套件. 



16. 將 kbar 套件發佈到 PyPI : 

在本系列第一篇測試時我已註冊 PyPI 帳號, 但如果要把打包好的套件發佈上傳至 PyPI 還必須啟用 2FA 雙因子認證, 然後建立一個 API token, 就可以用 twine 發佈到 PyPI 了 (執行時須輸入 API token, 否則無法上傳), 參考第三篇在 TestPyPI 上的做法. 

登入 PyPI 網站後按上方 2FA 的 "enable it now for your account" 連結 :




或者按右上角帳戶名稱, 點選選單中的 "Account settings" 就會顯示 2FA 設定頁面 : 




頁面顯示我在去年 (2024) 的大約此時曾產生過恢復碼 (8 組 16 個字元的密碼, 可隨時按 "Regenerate" 鈕產生新的恢復碼), 那時有複製下載後儲存備用 (啟用 2FA 必須使用一組恢復碼). 按左下方的 "Use a recovery code" 鈕 :




複製一組恢復碼貼入 "Enter recovery code" 框後按 "Verify" 鈕 :




恢復碼驗證成功後往下拉到 "Two factors authentication (2FA)" 項下, 按左下角的 "Add 2FA with authentication application" 鈕 :




這時會顯示一個 QR code 頁面, 用手機相機掃描 QR 碼, 點擊 URL 後選擇 Google Auth 應用程式, 它會顯示一個 6 位數號碼, 將其填入右方 "Verify application" 框中, 再按 "Set up application" 鈕 :




注意, 請將此 QR code 截圖儲存備用 (以後驗證時需要用到). 驗證成功後在 2FA 頁面左下角的 "Add 2FA with authentication application" 鈕就會消失 :




2FA 啟用通過後, 將 Account settings 頁面往下移到 "API tokens" 項下, 按 "Add API tokens" 鈕 :




輸入 Token name (例如 kbar-upload), Scope 勾選 "Entire account (all projects)", 然後按底下的 "Create token" 鈕 :




按 "Copy token" 鈕將 API token 複製到記事本儲存備用 :




有了 PyPI 的 API token 就可以將打包好的 kbar 套件上傳到 PyPI 網站了, 切換到專案目錄 kbar 底下, 輸入如下指令, 看到 Enter your API token 提示時, 複製上面取得之 API token 後按 Ctrl+V 貼上, 再按 Enter 即開始上傳套件包 : 

python -m twine upload dist/* 

D:\PyPi\kbar>python -m twine upload dist/*   
Uploading distributions to https://upload.pypi.org/legacy/
Enter your API token:    (按 Ctrl+V 貼上)
Uploading kbar-0.1.2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 17.1/17.1 kB • 00:00 • ?
Uploading kbar-0.1.2.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 19.1/19.1 kB • 00:00 • ?

View at:

訪問此網址即可看到 kbar 套件的網頁了 :




哈哈, 在起心動念近一年後, 我的第一支套件 kbar 終於上架了! 

迫不及待上 Colab 測試看看, 安裝 kbar 成功 : 




用下列程式碼繪製 K 線圖 : 

from kbar import KBar   
import yfinance as yf   
df=yf.download('0050.TW', start='2024-07-01', end='2024-08-21', auto_adjust=False)   
df.columns=df.columns.map(lambda x: x[0])    # 改成舊版單層索引
kb=KBar(df)    
kb.plot(title='台灣五十(0050.TW)', volume=True)




可見 kbar 會自動下載註冊 Noto Sans CJK JP 字型來顯示繁體中文. 

接下來在 Mapleboard 的 Ubuntu 上用虛擬環境來測試 :

tony1966@LX2438:~/python/$ python3 -m venv venv    

這會在目前工作目錄下建立一個虛擬環境資料夾 venv : 

然後用下列指令啟用虛擬環境 : 

tony1966@LX2438:~/python$ source venv/bin/activate   
(venv) tony1966@LX2438:~/python$  

用 pip3 install 從 PyPI 安裝 kbar 套件 :

(venv) tony1966@LX2438:~/python$ pip3 install kbar   
Collecting kbar
  Downloading kbar-0.1.2-py3-none-any.whl (7.8 kB)
Collecting pandas<3.0,>=2.0
  Using cached pandas-2.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (11.7 MB)
Collecting mplfinance>=0.12.10b0
  Using cached mplfinance-0.12.10b0-py3-none-any.whl (75 kB)
Collecting matplotlib<4.0,>=3.7
  Using cached matplotlib-3.10.5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (9.5 MB)
Collecting pyarrow>=14.0.2
  Using cached pyarrow-21.0.0-cp310-cp310-manylinux_2_28_aarch64.whl (41.1 MB)
Collecting numpy<2,>=1.23
  Using cached numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.2 MB)
Collecting contourpy>=1.0.1
  Using cached contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (312 kB)
Collecting cycler>=0.10
  Using cached cycler-0.12.1-py3-none-any.whl (8.3 kB)
Collecting packaging>=20.0
  Using cached packaging-25.0-py3-none-any.whl (66 kB)
Collecting kiwisolver>=1.3.1
  Using cached kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB)
Collecting pillow>=8
  Using cached pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (6.0 MB)
Collecting pyparsing>=2.3.1
  Using cached pyparsing-3.2.3-py3-none-any.whl (111 kB)
Collecting python-dateutil>=2.7
  Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Collecting fonttools>=4.22.0
  Using cached fonttools-4.59.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (4.8 MB)
Collecting tzdata>=2022.7
  Using cached tzdata-2025.2-py2.py3-none-any.whl (347 kB)
Collecting pytz>=2020.1
  Using cached pytz-2025.2-py2.py3-none-any.whl (509 kB)
Collecting six>=1.5
  Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pytz, tzdata, six, pyparsing, pyarrow, pillow, packaging, numpy, kiwisolver, fonttools, cycler, python-dateutil, contourpy, pandas, matplotlib, mplfinance, kbar
Successfully installed contourpy-1.3.2 cycler-0.12.1 fonttools-4.59.1 kbar-0.1.2 kiwisolver-1.4.9 matplotlib-3.10.5 mplfinance-0.12.10b0 numpy-1.26.4 packaging-25.0 pandas-2.3.2 pillow-11.3.0 pyarrow-21.0.0 pyparsing-3.2.3 python-dateutil-2.9.0.post0 pytz-2025.2 six-1.17.0 tzdata-2025.2

然後安裝 yfinance 來取得股票價量資料 :

(venv) tony1966@LX2438:~/python$ pip3 install yfinance  
Collecting yfinance
  Using cached yfinance-0.2.65-py2.py3-none-any.whl (119 kB)
Requirement already satisfied: numpy>=1.16.5 in ./venv/lib/python3.10/site-packages (from yfinance) (1.26.4)
Collecting protobuf>=3.19.0
  Using cached protobuf-6.32.0-cp39-abi3-manylinux2014_aarch64.whl (322 kB)
Collecting multitasking>=0.0.7
  Using cached multitasking-0.0.12-py3-none-any.whl
Collecting peewee>=3.16.2
  Using cached peewee-3.18.2-py3-none-any.whl
Collecting platformdirs>=2.0.0
  Using cached platformdirs-4.3.8-py3-none-any.whl (18 kB)
Requirement already satisfied: pandas>=1.3.0 in ./venv/lib/python3.10/site-packages (from yfinance) (2.3.2)
Requirement already satisfied: pytz>=2022.5 in ./venv/lib/python3.10/site-packages (from yfinance) (2025.2)
Collecting frozendict>=2.3.4
  Using cached frozendict-2.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (117 kB)
Collecting websockets>=13.0
  Using cached websockets-15.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (182 kB)
Collecting curl_cffi>=0.7
  Using cached curl_cffi-0.13.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (7.9 MB)
Collecting beautifulsoup4>=4.11.1
  Using cached beautifulsoup4-4.13.4-py3-none-any.whl (187 kB)
Collecting requests>=2.31
  Using cached requests-2.32.5-py3-none-any.whl (64 kB)
Collecting soupsieve>1.2
  Using cached soupsieve-2.7-py3-none-any.whl (36 kB)
Collecting typing-extensions>=4.0.0
  Using cached typing_extensions-4.14.1-py3-none-any.whl (43 kB)
Collecting certifi>=2024.2.2
  Using cached certifi-2025.8.3-py3-none-any.whl (161 kB)
Collecting cffi>=1.12.0
  Using cached cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (448 kB)
Requirement already satisfied: tzdata>=2022.7 in ./venv/lib/python3.10/site-packages (from pandas>=1.3.0->yfinance) (2025.2)
Requirement already satisfied: python-dateutil>=2.8.2 in ./venv/lib/python3.10/site-packages (from pandas>=1.3.0->yfinance) (2.9.0.post0)
Collecting idna<4,>=2.5
  Using cached idna-3.10-py3-none-any.whl (70 kB)
Collecting charset_normalizer<4,>=2
  Using cached charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (147 kB)
Collecting urllib3<3,>=1.21.1
  Using cached urllib3-2.5.0-py3-none-any.whl (129 kB)
Collecting pycparser
  Using cached pycparser-2.22-py3-none-any.whl (117 kB)
Requirement already satisfied: six>=1.5 in ./venv/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas>=1.3.0->yfinance) (1.17.0)
Installing collected packages: peewee, multitasking, websockets, urllib3, typing-extensions, soupsieve, pycparser, protobuf, platformdirs, idna, frozendict, charset_normalizer, certifi, requests, cffi, beautifulsoup4, curl_cffi, yfinance
Successfully installed beautifulsoup4-4.13.4 certifi-2025.8.3 cffi-1.17.1 charset_normalizer-3.4.3 curl_cffi-0.13.0 frozendict-2.4.6 idna-3.10 multitasking-0.0.12 peewee-3.18.2 platformdirs-4.3.8 protobuf-6.32.0 pycparser-2.22 requests-2.32.5 soupsieve-2.7 typing-extensions-4.14.1 urllib3-2.5.0 websockets-15.0.1 yfinance-0.2.65
(venv) tony1966@LX2438:~/python$ 

最後進入 Python 交談環境執行 K 線圖繪製指令 :

(venv) tony1966@LX2438:~/python$ python  
Python 3.10.12 (main, May 27 2025, 17:12:29) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from kbar import KBar   
>>> import yfinance as yf   
>>> df=yf.download('0050.TW', start='2024-07-01', end='2024-08-21', auto_adjust=False)   
[*********************100%***********************]  1 of 1 completed
>>> df.columns=df.columns.map(lambda x: x[0])    # 改成舊版單層索引
>>> kb=KBar(df)    
設定字體為: Noto Sans CJK JP
>>> kb.plot(title='台灣五十(0050.TW)', volume=True)  
使用指定字體: Noto Sans CJK JP
字體候選清單: ['Noto Sans CJK JP', 'DejaVu Sans', 'Liberation Sans']




測試完畢跳出 Python 關閉虛擬環境後刪除 venv 資料夾 :

>>> exit()  
(venv) tony1966@LX2438:~/python$ deactivate  
tony1966@LX2438:~/python$ rm -rf venv   

大功告成收工啦! 

沒有留言 :