2023年2月27日 星期一

2023 年第 9 周記事

上週四去河堤快走時覺得右腳踝怪怪的, 左右轉時有點微痛, 站立時卻不會, 原本想去裕仁學長的中醫診所給推拿師看看, 但後來還是先去公司附近的骨科, 想說照個 X 光確定一下原因, 哪知當日骨科沒診, 護理師說那就給復健科看看. 洪醫師看了看, 按壓問診後說是韌帶發炎, 開了一條 "易妥" 痠痛凝膠, 早晚擦患部一次, 又拿了一張 6 格的復健卡, 叫我一個月內用完 : 




問診完先到二樓復健部, 先做電療 + 紅外線, 然後做雷射, 共約 30 分鐘. 說也奇怪, 做完復健感覺好多了, 回去擦了凝膠, 第二天居然都好了, 但我還是連續三天都去做復健. 但下班後的 3 公里健走暫時要休息, 打算改成去游泳唄. 

228 連假四天活動很多, 周六下午回到家先去給阿泉伯母捻香, 上週她在家突然昏倒失去意識, 送醫才知腦中有水瘤, 壓迫到腦血管導致血管爆裂, 送 ICU 兩天血壓下降只好留口氣載回家, 上週四聽爸在電話中講還以為是指對面張家伙房也剛過世的阿清伯母, 實在不敢置信一向健朗的阿泉伯母突然走了. 另外, 村子裡以前管理水仙王伯公廟的阿達伯 (小狐狸們以前喚他伯公二號) 也在上周過身, 令我感嘆人生無常! 

週日岳父家掃墓, 10 年前帶小狐狸們參加過一次, 墓地位置在火葬場再過去約 100 公尺處, 連假太多人掃墓, 從路口一直到禪寺那一段都停滿車輛, 還好我騎機車很好鑽. 中午岳父家族在鄉內圓滿餐廳聚餐, 粗略估計有 15~20 桌, 參加人數上百人, 真是個開枝散葉的大家族啊! 

今天表妹從台中坐車來鄉下看爸, 說今年閏月, 出嫁的女兒要帶豬腳麵線回來給長輩吃, 祈福長壽, 我鄉似無此習俗, 可能是中部閩南庄習俗. 我這一輩無出嫁的女兒, 姑姑仙遊多年, 可能是想代替逝去的姑姑權充我家嫁出去的女兒, 真是有心了. 中午吃過飯便到菜園採番茄與草莓, 小番茄採了兩大袋; 另外晚餐煎了一大盤蒲粄, 裝了一袋讓她帶回台中.

下周就要掃墓了, 我昨天先去巡來台祖墓園, 發現居然已經有人來整理了, 但我還是回家拿鋤頭將墓旁一堆鬼針草鋤掉. 因今天表妹要來, 所以早上我沒上市場, 七點半就出發前往派出所對面山上的家祠整理, 經過一番搏鬥, 終於在 10 點把盤據在家祠右側的藤蔓枯葉全數清除乾淨, 趕緊回家在表妹到達前將午餐準備好. 午飯後帶表妹去菜園採番茄與草莓, 採滿兩大袋小番茄, 又做了一大盤蒲粄, 四點多趕緊將帶來的豬腳麵線熱好提早吃晚餐, 然後載她去車站趕客運車到高鐵站, 今天 真是忙碌但又愉快的一天.  

今天在整理墓園時突然想到, 將來退休後可以幫人整理與巡守墓園, 我八字還算重, 出入墓園從不覺得可怕 (人才可怕), 應該還蠻適合這個工作. 也許可以買台空拍機考一下執照, 定期幫雇主做高科技巡墓, 現在電鋸也買了, 柴刀等工具樣樣有, 就只缺一台空拍機了. 

2023年2月25日 星期六

TOTOLINK EX200 WiFi 橋接器測試

上週在露天買的 TOTOLINK EX200 WiFi 橋接器昨天到貨, 今天帶回鄉下安裝測試, 結果還不錯. 其實所謂安裝就是讓橋接器與主基地台連線而已, 程序很簡單 :
  1. 在主基地台附近找個插座將 EX200 橋接器插上去. 
  2. 等待橋接器 WPS 按鈕左側的系統指示燈 (藍) 慢閃 (表示 READY), 這時按住主基地台後面的 WPS 鈕至少 2 秒以上才放開, 接著按住橋接器的 WPS 鈕至少 2 秒再放開, 這時 WPS 鈕右邊的連線指示燈 (綠) 會先慢閃 (表示正與主基地台連線), 這時橋接器的 SSID 還是 TOTOLINK_EX200. 
  3. 等待橋接器 WPS 按鈕右側的連線指示燈常亮時, 表示連線成功, 這時它的 SSID 就會變成主基地台的 SSID. 這樣就可以拔下橋接器, 拿到離主基地台稍遠之處插到插座上, 它就會將主基地台信號中繼出去. 
我先走到大門口的波蘿蜜樹下量到從書房的 ASUS-RT-AX300 發射的信號強度為 77% :




然後將橋接器插在門口的插座上, 再次於波羅蜜樹下測量, 得到 97% 強度 :




可見橋接器增強了 20% 的信號. 

然後我拔掉橋接器, 走到菜園中央, 量測到 ASUS-RT-AX3000 的信號為 75% :




然後將橋接器插在洗衣機上方的插座上, 重回菜園中央量測, 測得信號強度 95% : 



網速下載約 19MB, 上傳約 10MB :





我走到菜園末端還量得 80% 強度 : 




網速下載約 10MB, 上傳約 5MB : 




看這些數據感覺還不錯, 給放在菜園末端的 ESP32-CAM 使用都還 OK, 值得再買兩個來展延網路覆蓋面積以利物聯網感測監控之用 (打算一個放前門, 一個放車庫, 另一個放 1-2 樓梯間). 

露天購買鍵盤注音貼紙

昨晚順利將 ThinkPad 筆電改成 Win10 中文版介面後, 才注意到鍵盤為美式 (純英文, 沒有注音符號, 但我依據位置記憶還可以瞎打出幾個正確的字, 哈哈) :

今天在露天買了透明底白字的單注音貼紙 : 





因萊爾富要滿 99 才免運, 所以就買了 7 張. 

2023-03-01 補充 :

晚上回到高雄就去萊爾富取貨, 然後花了一個小時慢慢貼上去, 結果很不錯哩 :



如何將英文版 Win10 改成繁體中文版

昨天水某帶回一台計畫結束報廢的 ThinkPad 筆電, 機器外觀整體還很新 (可能比我那機齡已 4 年的 Acer Swift5 還新, 待查), 有 8G DRAM 與 512GB SSD, 電池已無法存電, 所以必須插電才能用. 但比較頭疼的是那英文版的 Win10 (專業版喔), 鍵盤也是只有英文, 沒注音標示. 

先來解決 Win10 語言介面問題, 我找到下面這篇文章, 原來 Windows 可以輕易設定成任何語言版本介面 (因為改語言介面過程中通常需要下載語言包,所以必須連上網路), 參考 : 


文中還附影片說明 :





作法很簡單, 只要點齒輪 Settings 進去設定, 再點 Language, 我發現這台 ThinkPad 內建的語言包只包含簡體中文, 沒有繁體中文, 可點底下的 + Add prefered language 鈕進去添加語言包, 往下找到 "中文 (台灣)" 這一項新增即可 : 





下載安裝完畢後在 Language 選單就會出現 "中文 (台灣)" 選項, 點選後會出現提示, 詢問是否要登出再登入, 這樣設定才會生效 : 




再次登入就會看到 Windows 介面已經變成中文了 : 




這台乃內置式電池, 背板型號是 20LT-S30800 :





換電池可能要找原廠, 其高雄維修中心在前金區中華三路 108 號 8 樓 B  (國泰人壽大樓8樓), 電話 : (07 ) 211-3229. 但如果太貴我就不換了, 就當作是臥室五斗櫃上的桌電使用就好了. 

參考 : 


2023年2月24日 星期五

Aliexpress 購買遙控飛機 G1 Fighter

今天在 Aliexpress 買了一個小玩具 : G1 Fighter 遙控飛機 :





我選擇藍色附 3 個電池的組合, 價格為 35.56 美元, 合台幣約 1080元 (免運). 





這款 G1 Fighter 則是 EPP 材質, 耐撞耐摔可彎曲, 就算摔機也不會心疼 :





很多年前小狐狸們還在幼稚園時在大統新世紀的反斗城買過一個遙控飛機, 姊姊與二哥在鄉下曬穀場上玩得不亦樂乎, 但機身是用保麗龍做的, 幾次操控不慎撞機後就傷痕累累, 最後就飛不起來了. 而且那時不是用鋰電池, 而是鎳氫, 充飽電只能飛 8~10 分鐘. 這款 RC 飛機採用 500 mAh 鋰電池, 續航時間為 20 分鐘. 

2023-03-04 補充 :

今天追蹤遞送流程, 發現 3/3 已到轉運中心 tranportation hub, 但卻被退回, 原因不明 :




下周再打電話到香港  (852) 2921 2222 詢問. 遞送編號是 LB323285216SG.


2023-04-09 補充 :

今天上 Aliexpress 追蹤, 發現賣家沒有再次遞送貨品 (上次回覆 4/6 會再次遞送), 點 Contact 查看訊息, 賣家回覆因太多電池無法寄送, 建議我取消交易申請退費, 改買附 2 顆電池的, 傻眼, 選項中就還是有賣附三顆電池的啊! 先申請退貨唄 :





這是我在 Aliexpress 買東西第二次申請退費的經驗 (上次是買樹莓派 P400). 若改買附兩個電池的話, 價格大概是台幣 997 元, 等這陣子忙完再說吧.

2023年2月22日 星期三

好站 : Drone Programming With Python Course

 今天在 Youtube 找到一部很棒的影片 : 





影片長達 3.5 小時, 作者從旋翼機原理開始講起, 介紹了無人機的構成部件, 以及如何用 Python 進行影像識別, 臉孔辨識, 以及循線飛行等. 

影片所使用的旋翼機為 Tello 無人機, Tello 是中國深圳睿熾科技研發的四旋翼無人機, 採用 DJI 大疆授權之飛控系統, 它有開放 SDK, 可用 Scratch 或 Python 進行二次開發, 參考 :


DJI Tello 一台 momo 價格為 3500 元:


我曾在書店看到一本用 Python 控制 Tello 無人機的書 :
不過因為內容似乎太少就沒買. 

Python 學習筆記 : 用 Streamlit 開發網頁應用程式 (一) 安裝套件

最近發現一個很棒的 Python 套件 Streamlit, 有別於傳統的 Flask 或 Django 等套件, Streamlit 只需要用 Python 就可以生成網頁, 完全不需要去管 HTML, CSS, Javascript, React 等前端技術, 對專注於學術研究者, 以及從事資料科學或機器學習專案的 Python 程式員來說真是一個福音, 就算沒有前端技術背景, 單純依靠 Python 也能端出美美的互動式網頁介面來呈現專案結果.  

Streamlit 簡介如下 :  
  • Streamlit 是一個開源的 Python 套件, 由 2018 年創立於舊金山的同名軟體公司所研發, 創辦人為 Adrien Treuille, Amanda Kelly, and Thiago Teixeira. 主要是為了解決資料科學家與機器學習專家在解釋與部署資料分析專案時所面對的網頁前後端技術挑戰, 讓他們只要使用 Python 即可解決互動式網頁 UI 需求, 可專注於資料驅動的應用專案本身而毋須分心於前後端網頁技術.
  • Streamlit 能與資料科學 & 機器學習常用套件 Numpy, Pandas, Matplotlib, Seaborn, Plotly, Scikit-learn, TensorFlow, PyTorch, ... 等串接整合, 所產出的網頁本身即具有互動 (interactive) 功能. 
  • Streamlit 主要是為了原型應用程式 (prototype application) 而開發, 使用者不需要具備前端網頁相關技術背景, 故可節省開發時間, 快速完成專案. 
  • Streamlit 提供 Streamlit Cloud 雲端平台 (https://streamlit.io/cloud) 可讓使用者佈署所開發的應用程式, 方便客戶線上體驗成果 (免費帳戶可發布三個應用程式). 
  • Streamlit 在前端使用了 React 技術 (與 Dash 一樣); 後端則是採用 Tornado 框架. 
參考官網 :


Streamlit 於 2019 年開放原始碼, 寄存於 GitHub :


參考書籍 : 
 
1. 安裝 Streamlit : 

使用 pip install 安裝 (目前是 1.17.0 版) : 

pip install streamlit

C:\Users\User>pip install streamlit   
Collecting streamlit
  Downloading streamlit-1.17.0-py2.py3-none-any.whl (9.3 MB)
     ---------------------------------------- 9.3/9.3 MB 2.4 MB/s eta 0:00:00
Requirement already satisfied: python-dateutil in c:\python37\lib\site-packages (from streamlit) (2.7.5)
Collecting pyarrow>=4.0
  Downloading pyarrow-11.0.0-cp37-cp37m-win_amd64.whl (20.6 MB)
     ---------------------------------------- 20.6/20.6 MB 5.0 MB/s eta 0:00:00
Requirement already satisfied: typing-extensions>=3.10.0.0 in c:\python37\lib\site-packages (from streamlit) (4.3.0)
Requirement already satisfied: cachetools>=4.0 in c:\python37\lib\site-packages (from streamlit) (4.1.1)
Collecting rich>=10.11.0
  Downloading rich-13.3.1-py3-none-any.whl (239 kB)
     ---------------------------------------- 239.0/239.0 kB 4.9 MB/s eta 0:00:00
Collecting blinker>=1.0.0
  Downloading blinker-1.5-py2.py3-none-any.whl (12 kB)
Requirement already satisfied: packaging>=14.1 in c:\python37\lib\site-packages (from streamlit) (20.7)
Requirement already satisfied: pandas>=0.21.0 in c:\python37\lib\site-packages (from streamlit) (1.2.5)
Requirement already satisfied: click>=7.0 in c:\python37\lib\site-packages (from streamlit) (8.1.3)
Requirement already satisfied: requests>=2.4 in c:\python37\lib\site-packages (from streamlit) (2.28.1)
Collecting toml
  Downloading toml-0.10.2-py2.py3-none-any.whl (16 kB)
Collecting watchdog
  Downloading watchdog-2.2.1-py3-none-win_amd64.whl (78 kB)
     ---------------------------------------- 79.0/79.0 kB 4.3 MB/s eta 0:00:00
Requirement already satisfied: numpy in c:\python37\lib\site-packages (from streamlit) (1.19.4)
Requirement already satisfied: importlib-metadata>=1.4 in c:\python37\lib\site-packages (from streamlit) (4.12.0)
Collecting pympler>=0.9
  Downloading Pympler-1.0.1-py3-none-any.whl (164 kB)
     ---------------------------------------- 164.8/164.8 kB 5.0 MB/s eta 0:00:00
Collecting semver
  Downloading semver-2.13.0-py2.py3-none-any.whl (12 kB)
Collecting gitpython!=3.1.19
  Downloading GitPython-3.1.30-py3-none-any.whl (184 kB)
     ---------------------------------------- 184.0/184.0 kB 3.8 MB/s eta 0:00:00
Requirement already satisfied: tornado>=5.0 in c:\python37\lib\site-packages (from streamlit) (6.0.4)
Collecting validators>=0.2
  Downloading validators-0.20.0.tar.gz (30 kB)
  Preparing metadata (setup.py) ... done
Requirement already satisfied: pillow>=6.2.0 in c:\python37\lib\site-packages (from streamlit) (8.1.0)
Requirement already satisfied: tzlocal>=1.1 in c:\python37\lib\site-packages (from streamlit) (2.0.0)
Collecting altair>=3.2.0
  Downloading altair-4.2.2-py3-none-any.whl (813 kB)
     ---------------------------------------- 813.6/813.6 kB 7.3 MB/s eta 0:00:00
Requirement already satisfied: protobuf<4,>=3.12 in c:\python37\lib\site-packages (from streamlit) (3.14.0)
Collecting pydeck>=0.1.dev5
  Downloading pydeck-0.8.0-py2.py3-none-any.whl (4.7 MB)
     ---------------------------------------- 4.7/4.7 MB 10.4 MB/s eta 0:00:00
Requirement already satisfied: jinja2 in c:\python37\lib\site-packages (from altair>=3.2.0->streamlit) (3.1.2)
Collecting toolz
  Downloading toolz-0.12.0-py3-none-any.whl (55 kB)
     ---------------------------------------- 55.8/55.8 kB ? eta 0:00:00
Requirement already satisfied: entrypoints in c:\python37\lib\site-packages (from altair>=3.2.0->streamlit) (0.3)
Requirement already satisfied: jsonschema>=3.0 in c:\python37\lib\site-packages (from altair>=3.2.0->streamlit) (3.2.0)
Requirement already satisfied: colorama in c:\python37\lib\site-packages (from click>=7.0->streamlit) (0.4.1)
Collecting gitdb<5,>=4.0.1
  Downloading gitdb-4.0.10-py3-none-any.whl (62 kB)
     ---------------------------------------- 62.7/62.7 kB 3.3 MB/s eta 0:00:00
Requirement already satisfied: zipp>=0.5 in c:\python37\lib\site-packages (from importlib-metadata>=1.4->streamlit) (3.1.0)
Requirement already satisfied: pyparsing>=2.0.2 in c:\python37\lib\site-packages (from packaging>=14.1->streamlit) (2.3.1)
Requirement already satisfied: pytz>=2017.3 in c:\python37\lib\site-packages (from pandas>=0.21.0->streamlit) (2018.9)
Requirement already satisfied: six>=1.9 in c:\python37\lib\site-packages (from protobuf<4,>=3.12->streamlit) (1.12.0)
Requirement already satisfied: certifi>=2017.4.17 in c:\python37\lib\site-packages (from requests>=2.4->streamlit) (2018.11.29)
Requirement already satisfied: charset-normalizer<3,>=2 in c:\python37\lib\site-packages (from requests>=2.4->streamlit) (2.1.1)
Requirement already satisfied: idna<4,>=2.5 in c:\python37\lib\site-packages (from requests>=2.4->streamlit) (2.8)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\python37\lib\site-packages (from requests>=2.4->streamlit) (1.24.1)
Requirement already satisfied: markdown-it-py<3.0.0,>=2.1.0 in c:\python37\lib\site-packages (from rich>=10.11.0->streamlit) (2.1.0)
Collecting pygments<3.0.0,>=2.14.0
  Downloading Pygments-2.14.0-py3-none-any.whl (1.1 MB)
     ---------------------------------------- 1.1/1.1 MB 10.1 MB/s eta 0:00:00
Requirement already satisfied: decorator>=3.4.0 in c:\python37\lib\site-packages (from validators>=0.2->streamlit) (4.3.2)
Collecting smmap<6,>=3.0.1
  Downloading smmap-5.0.0-py3-none-any.whl (24 kB)
Requirement already satisfied: MarkupSafe>=2.0 in c:\python37\lib\site-packages (from jinja2->altair>=3.2.0->streamlit) (2.1.1)
Requirement already satisfied: attrs>=17.4.0 in c:\python37\lib\site-packages (from jsonschema>=3.0->altair>=3.2.0->streamlit) (19.3.0)
Requirement already satisfied: pyrsistent>=0.14.0 in c:\python37\lib\site-packages (from jsonschema>=3.0->altair>=3.2.0->streamlit) (0.16.0)
Requirement already satisfied: setuptools in c:\python37\lib\site-packages (from jsonschema>=3.0->altair>=3.2.0->streamlit) (51.0.0)
Requirement already satisfied: mdurl~=0.1 in c:\python37\lib\site-packages (from markdown-it-py<3.0.0,>=2.1.0->rich>=10.11.0->streamlit) (0.1.2)
Building wheels for collected packages: validators
  Building wheel for validators (setup.py) ... done
  Created wheel for validators: filename=validators-0.20.0-py3-none-any.whl size=19567 sha256=59014cff92b0a382bbf5c7961643c276bca5c3d4a2de9df1d119090de8563028
  Stored in directory: c:\users\user\appdata\local\pip\cache\wheels\5f\55\ab\36a76989f7f88d9ca7b1f68da6d94252bb6a8d6ad4f18e04e9
Successfully built validators
Installing collected packages: watchdog, validators, toolz, toml, smmap, semver, pympler, pygments, pyarrow, blinker, rich, pydeck, gitdb, gitpython, altair, streamlit
  Attempting uninstall: pygments
    Found existing installation: Pygments 2.3.1
    Uninstalling Pygments-2.3.1:
      Successfully uninstalled Pygments-2.3.1
Successfully installed altair-4.2.2 blinker-1.5 gitdb-4.0.10 gitpython-3.1.30 pyarrow-11.0.0 pydeck-0.8.0 pygments-2.14.0 pympler-1.0.1 rich-13.3.1 semver-2.13.0 smmap-5.0.0 streamlit-1.17.0 toml-0.10.2 toolz-0.12.0 validators-0.20.0 watchdog-2.2.1

可見 Streamlit 本身其實才 10 MB 不到, 但依賴於許多其他 Python 套件 (例如依賴 Tornado 框架來建立後端環境). 

進入 Python IDLE 匯入 streamlit (通常取簡名 st) 後用 .__version__ 屬性檢查版本 :

D:\Python\test\streamlit>python  
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import streamlit as st    
>>> st.__version__    
'1.17.0'   

注意, Streamlit 必須在 Python 3.7 以上環境才能運作. 


2. Streamlit 內建應用程式 hello 展示 : 

Streamlit 本身自帶了一個 hello 應用程式範例, 安裝完 Streamlit 后馬上就可以執行. 執行此內建 App 的方法是在命令列輸入 streamlit hello 即可 : 

C:\Users\User>streamlit hello   

  Welcome to Streamlit!

  If you’d like to receive helpful onboarding emails, news, offers, promotions,
  and the occasional swag, please enter your email address below. Otherwise,
  leave this field blank.

  Email:   (輸入郵件信箱或直接按 Enter)

  You can find our privacy policy at https://streamlit.io/privacy-policy

  Summary:
  - This open source library collects usage statistics.
  - We cannot see and do not store information contained inside Streamlit apps,
    such as text, charts, images, etc.
  - Telemetry data is stored in servers in the United States.
  - If you'd like to opt out, add the following to %userprofile%/.streamlit/config.toml,
    creating that file if necessary:

    [browser]
    gatherUsageStats = false


  Welcome to Streamlit. Check out our demo in your browser.

  Local URL: http://localhost:8501   
  Network URL: http://192.168.43.14:8501    

  Ready to create your own Python apps super quickly?
  Head over to https://docs.streamlit.io

  May you create awesome apps!

執行此應用程式后 Streamlit 會在用 Tornado 建立一個後端伺服器, 將應用程式放在預設埠 8501, 然後自動開啟瀏覽器頁籤來顯示此網頁 App :




Streamlit App 網頁分成左右兩邊, 左側邊框為 App 導覽 (可按 X 鈕隱藏); 右邊框用來顯示內容. 此 hello App 提供了四個展示頁面 (Animation/Plotting/Mapping/DataFrame ), 可點選左邊框的超連結啟動 : 







每個展示底下都有 Python 原始碼, 其長度都不長, 簡單幾行程式碼就能展現如此複雜頁面, 可見 Streamlit 確實能幫助資料科學與機器學習專案工程師快速展示原型成果, 不需要具備 HTML, CSS, Javascript, React, Flask 等網頁技術基礎. 

在命令列按 Ctrl + C 即可關閉伺服器停止執行 App. 


3. 撰寫自己的 Streamlit 應用程式 : 

撰寫 Streamlit App 首先需匯入此套件, 習慣上會取簡名 st :

import streamlit as st 

先來檢視 Streamlit 套件的成員內容, 以下使用一個自訂模組 members, 其 list_members() 函式會列出模組或套件中的公開成員 (即屬性與方法), 參考 :

Python 學習筆記 : 檢視物件成員與取得變數名稱字串的方法

d:\test\python>python   
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import streamlit as st   
>>> import members    
>>> members.list_members(st)    
altair_chart <class 'method'>
area_chart <class 'method'>
audio <class 'method'>
balloons <class 'method'>
bar_chart <class 'method'>
beta_columns <class 'function'>
beta_container <class 'function'>
beta_expander <class 'function'>
bokeh_chart <class 'method'>
button <class 'method'>
cache <class 'function'>
camera_input <class 'method'>
caption <class 'method'>
case_converters <class 'module'>
checkbox <class 'method'>
code <class 'method'>
code_util <class 'module'>
color_picker <class 'method'>
columns <class 'method'>
commands <class 'module'>
config <class 'module'>
config_option <class 'module'>
config_util <class 'module'>
container <class 'method'>
cursor <class 'module'>
dataframe <class 'method'>
date_input <class 'method'>
delta_generator <class 'module'>
deprecation_util <class 'module'>
development <class 'module'>
download_button <class 'method'>
echo <class 'function'>
elements <class 'module'>
emojis <class 'module'>
empty <class 'method'>
env_util <class 'module'>
error <class 'method'>
error_util <class 'module'>
errors <class 'module'>
exception <class 'method'>
expander <class 'method'>
experimental_get_query_params <class 'function'>
experimental_memo <class 'streamlit.runtime.caching.memo_decorator.MemoAPI'>
experimental_rerun <class 'function'>
experimental_set_query_params <class 'function'>
experimental_show <class 'function'>
experimental_singleton <class 'streamlit.runtime.caching.singleton_decorator.SingletonAPI'>
experimental_user <class 'streamlit.user_info.UserInfoProxy'>
file_uploader <class 'method'>
file_util <class 'module'>
folder_black_list <class 'module'>
form <class 'method'>
form_submit_button <class 'method'>
get_option <class 'function'>
graphviz_chart <class 'method'>
header <class 'method'>
help <class 'method'>
image <class 'method'>
info <class 'method'>
js_number <class 'module'>
json <class 'method'>
latex <class 'method'>
line_chart <class 'method'>
logger <class 'module'>
map <class 'method'>
markdown <class 'method'>
metric <class 'method'>
multiselect <class 'method'>
number_input <class 'method'>
plotly_chart <class 'method'>
progress <class 'method'>
proto <class 'module'>
pydeck_chart <class 'method'>
pyplot <class 'method'>
radio <class 'method'>
runtime <class 'module'>
secrets <class 'streamlit.runtime.secrets.Secrets'>
select_slider <class 'method'>
selectbox <class 'method'>
session_state <class 'streamlit.runtime.state.session_state_proxy.SessionStateProxy'>
set_option <class 'function'>
set_page_config <class 'function'>
sidebar <class 'streamlit.delta_generator.DeltaGenerator'>
slider <class 'method'>
snow <class 'method'>
source_util <class 'module'>
spinner <class 'function'>
stop <class 'function'>
string_util <class 'module'>
subheader <class 'method'>
success <class 'method'>
table <class 'method'>
tabs <class 'method'>
text <class 'method'>
text_area <class 'method'>
text_input <class 'method'>
time_input <class 'method'>
title <class 'method'>
type_util <class 'module'>
user_info <class 'module'>
util <class 'module'>
vega_lite_chart <class 'method'>
vendor <class 'module'>
version <class 'module'>
video <class 'method'>
warning <class 'method'>
watcher <class 'module'>
write <class 'method'>

可見 Streamlit 提供了非常多函式來渲染網頁元件, 其中 write() 函式用來輸出一般文字, 只要兩行程式碼就可以輸出 Hello World 字串 :

# hello.py
import streamlit as st
st.write('Hello World')

將此兩行程式碼存成 hello.py, 然後開啟命令列視窗, 切換到此程式目錄下, 執行下列指令 :

streamlit run hello.py

D:\test\python\streamlit>streamlit run hello.py    

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://192.168.2.109:8501

此指令會用預設瀏覽器開啟 8501 埠來顯示網頁, 結果如下 :




這就是 Streamlit 輸出的最簡單網頁. 檢視網頁原始碼可以發現網頁內容裡沒有 'Hello World', 那是由 Javascript 產生的 :




後續將逐一來測試這些渲染出各種網頁元件的函式.


2024-12-20 補充 :

最近在測試與 Streamlit 類似但更輕量的 Gradio 套件時找到另一個支援 Streamlit 的 Python web app 執行空間 :

 
你只要註冊 Hugging Face 免費帳號即可在此空間佈署 Streamlit web app, 它不會限制可佈署的 Web app 數量, 但免費帳戶只能使用分享主機 (無 GPU). 付費帳戶則可挑選不同等級主機與使用 GPU, 這比 Streamlit Cloud 雲端平台更好康. 用法參考 Gradio 筆記 :


Mapleboard MP510-50 測試 (十五) : 編譯與安裝 TA-Lib 套件

安裝 Python 技術分析套件 Ta-Lib 的程序比較特殊, 不是直接用 pip install 就能安裝成功, 在 Windows 系統上必須依據 Python 版本下載編譯過的 whl 檔用 pip install 安裝, 參考 :


在 Linux 系統則必須先下載舊版 (v0.4.0) 原始碼用 make 進行編譯后, 再用 pip install 安裝最新版的 Ta-Lib (v4.5.0), 作法參考在樹莓派上的安裝方法 : 


Ta-Lib v0.4.0 的下載網址有如下兩個 :


在 Mapleboard 的 Ubuntu 下編譯原始碼與在樹莓派上有一點不同, 在執行 configure 時必須指定 build 參數, 否則會出現無法識別作業系統之錯誤, 完整的編譯安裝指令如下 :

$ wget https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
$ tar -xvf ta-lib-0.4.0-src.tar.gz 
$ cd ta-lib   
$ ./configure --prefix=/usr --build=aarch64-unknown-linux-gnu   
$ sudo make    
$ sudo make install   
$ sudo pip3 install ta-lib     (這會升級到最新版)

本系列全部測試文章參考 :


安裝過程記錄如下 : 


1. 下載 Ta-lib v0.4.0 版原始碼 : 

one@LX2438:~$ wget https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
--2023-02-21 23:22:20--  https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
正在查找主機 sourceforge.net (sourceforge.net)... 2606:4700::6812:b80, 2606:4700::6812:a80, 104.18.10.128, ...
正在連接 sourceforge.net (sourceforge.net)|2606:4700::6812:b80|:443... 連上了。
已送出 HTTP 要求,正在等候回應... 301 Moved Permanently
位置:https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz/ [跟隨至新的 URL]
--2023-02-21 23:22:21--  https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz/
繼續使用對 [sourceforge.net]:443 的已存在連線。
已送出 HTTP 要求,正在等候回應... 301 Moved Permanently
位置:https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz/download [跟隨至新的 URL]
--2023-02-21 23:22:21--  https://sourceforge.net/projects/ta-lib/files/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz/download
繼續使用對 [sourceforge.net]:443 的已存在連線。
已送出 HTTP 要求,正在等候回應... 302 Found
位置:https://downloads.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz?ts=gAAAAABj9OGtiJFHrIYZPdNfFZXpYzkjNna20gjFx4zIIo9CSWrsLmooS0B0pg84kRoPK1eOFMo8jm-lcdMG8UVOBaO8QyHB-g%3D%3D&use_mirror=nchc&r= [跟隨至新的 URL]
--2023-02-21 23:22:21--  https://downloads.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz?ts=gAAAAABj9OGtiJFHrIYZPdNfFZXpYzkjNna20gjFx4zIIo9CSWrsLmooS0B0pg84kRoPK1eOFMo8jm-lcdMG8UVOBaO8QyHB-g%3D%3D&use_mirror=nchc&r=
正在查找主機 downloads.sourceforge.net (downloads.sourceforge.net)... 204.68.111.105
正在連接 downloads.sourceforge.net (downloads.sourceforge.net)|204.68.111.105|:443... 連上了。
已送出 HTTP 要求,正在等候回應... 302 Found
位置:https://nchc.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz [跟隨至新的 URL]
--2023-02-21 23:22:22--  https://nchc.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
正在查找主機 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)... 2001:e10:ffff:1f02::17, 140.110.96.69
正在連接 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)|2001:e10:ffff:1f02::17|:443... 連上了。
已送出 HTTP 要求,正在等候回應... 200 OK
長度: 1330299 (1.3M) [application/x-gzip]
儲存到:‘ta-lib-0.4.0-src.tar.gz’

ta-lib-0.4.0-src.tar.gz               100%[=======================================================================>]   1.27M  --.-KB/s    於 0.1s    

2023-02-21 23:22:22 (9.28 MB/s) - 已儲存 ‘ta-lib-0.4.0-src.tar.gz’ [1330299/1330299]


2. 解壓縮 Ta-lib v0.4.0 版原始碼 : 

one@LX2438:~$ tar -xvf ta-lib-0.4.0-src.tar.gz
ta-lib/
ta-lib/config.sub
ta-lib/aclocal.m4
ta-lib/CHANGELOG.TXT
ta-lib/include/
ta-lib/include/ta_abstract.h
ta-lib/include/ta_func.h
ta-lib/include/ta_common.h
ta-lib/include/ta_config.h.in
ta-lib/include/Makefile.am
ta-lib/include/ta_libc.h
ta-lib/include/ta_defs.h
ta-lib/missing
ta-lib/ta-lib.spec.in
ta-lib/config.guess
ta-lib/Makefile.in
ta-lib/ta-lib.dpkg.in
ta-lib/Makefile.am
..... (略) .....
ta-lib/src/tools/Makefile.in
ta-lib/src/tools/Makefile.am
ta-lib/src/tools/gen_code/
ta-lib/src/tools/gen_code/java/
ta-lib/src/tools/gen_code/java/PrettyCode.java
ta-lib/src/tools/gen_code/java/Main.java
ta-lib/src/tools/gen_code/gen_code.c
ta-lib/src/tools/gen_code/Makefile.in
ta-lib/src/tools/gen_code/Makefile.am
ta-lib/src/tools/gen_code/mcpp.exe

可見解壓縮后的原始碼都放在 ta-lib 子目錄下. 


3. 用 configure 設定存放路徑 : 

先切換到解壓縮后的原始碼子目錄 ta-lib, 再用 configure 指令設定, 先不帶 build 參數 : 

one@LX2438:~$ cd ta-lib   
one@LX2438:~/ta-lib$ ./configure --prefix=/usr     
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking build system type... ./config.guess: unable to guess system type

This script, last modified 2006-07-02, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from

  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
and
  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub

If the version you run (./config.guess) is already up to date, please
send the following data and any information you think might be
pertinent to <config-patches@gnu.org> in order to provide the needed
information to handle your system.

config.guess timestamp = 2006-07-02

uname -m = aarch64
uname -r = 5.15.74-mp510+
uname -s = Linux
uname -v = #1 SMP PREEMPT Tue Oct 18 09:02:35 CST 2022

/usr/bin/uname -p = aarch64
/bin/uname -X     = 

hostinfo               = 
/bin/universe          = 
/usr/bin/arch -k       = 
/bin/arch              = aarch64
/usr/bin/oslevel       = 
/usr/convex/getsysinfo = 

UNAME_MACHINE = aarch64
UNAME_RELEASE = 5.15.74-mp510+
UNAME_SYSTEM  = Linux
UNAME_VERSION = #1 SMP PREEMPT Tue Oct 18 09:02:35 CST 2022
configure: error: cannot guess build type; you must specify one    

可見與樹莓派環境下編譯不同, 不帶 build 參數無法完成設定, configure 程式碼死在 checking build system type 這階段, 它無法識別出作業系統是哪一種, 一定要透過 build 參數明確指定才行. 

我在下面這篇文章找到 build 參數要帶 'aarch64-unknown-linux-gnu' :


帶上此 build 參數重新設定就能順利完成了 : 

one@LX2438:~/ta-lib$ ./configure --prefix=/usr --build=aarch64-unknown-linux-gnu    
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for a sed that does not truncate output... /usr/bin/sed
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
..... (略) ......
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating src/ta_abstract/Makefile
config.status: creating src/ta_common/Makefile
config.status: creating src/ta_func/Makefile
config.status: creating src/tools/Makefile
config.status: creating src/tools/gen_code/Makefile
config.status: creating src/tools/ta_regtest/Makefile
config.status: creating ta-lib-config
config.status: creating ta-lib.spec
config.status: creating ta-lib.dpkg
config.status: creating include/ta_config.h
config.status: executing depfiles commands

可見明確指定 build system type 后就順利完成設定了. 


4. 用 make 編譯原始碼 :

one@LX2438:~/ta-lib$ sudo make    
[sudo] one 的密碼: 
..... (略) ......
gcc -g -O2 -o .libs/ta_regtest ta_regtest-ta_regtest.o ta_regtest-test_data.o ta_regtest-test_util.o ta_regtest-test_abstract.o ta_regtest-test_adx.o ta_regtest-test_mom.o ta_regtest-test_sar.o ta_regtest-test_rsi.o ta_regtest-test_candlestick.o ta_regtest-test_per_ema.o ta_regtest-test_per_hlc.o ta_regtest-test_stoch.o ta_regtest-test_macd.o ta_regtest-test_minmax.o ta_regtest-test_per_hlcv.o ta_regtest-test_1in_1out.o ta_regtest-test_1in_2out.o ta_regtest-test_per_ohlc.o ta_regtest-test_stddev.o ta_regtest-test_bbands.o ta_regtest-test_ma.o ta_regtest-test_po.o ta_regtest-test_per_hl.o ta_regtest-test_trange.o ta_regtest-test_internals.o  -L/home/one/ta-lib/src /home/one/ta-lib/src/.libs/libta_lib.so -lm -lpthread -ldl
creating ta_regtest
make[2]: 離開目錄「/home/one/ta-lib/src/tools/ta_regtest」
make[2]: 進入目錄「/home/one/ta-lib/src/tools」
make[2]: 對「all-am」無需做任何事。
make[2]: 離開目錄「/home/one/ta-lib/src/tools」
make[1]: 離開目錄「/home/one/ta-lib/src/tools」
make[1]: 進入目錄「/home/one/ta-lib」
make[1]: 對「all-am」無需做任何事。
make[1]: 離開目錄「/home/one/ta-lib」

編譯過程會吐出非常多看不懂的資訊, 只要沒出現 error 即可. 


5. 用 make install 安裝編譯好的程式 :

one@LX2438:~/ta-lib$ sudo make install  
[sudo] one 的密碼: 
Making install in src
make[1]: 進入目錄「/home/one/ta-lib/src」
Making install in ta_abstract
make[2]: 進入目錄「/home/one/ta-lib/src/ta_abstract」
make[3]: 進入目錄「/home/one/ta-lib/src/ta_abstract」
make[3]: 對「install-exec-am」無需做任何事。
test -z "/usr/include/ta-lib/" || /usr/bin/mkdir -p "/usr/include/ta-lib/"
 /usr/bin/install -c -m 644 '../../include/ta_defs.h' '/usr/include/ta-lib//ta_defs.h'
 /usr/bin/install -c -m 644 '../../include/ta_libc.h' '/usr/include/ta-lib//ta_libc.h'
 /usr/bin/install -c -m 644 '../../include/ta_abstract.h' '/usr/include/ta-lib//ta_abstract.h'
..... (略) ......
make[3]: 離開目錄「/home/one/ta-lib/src/tools」
make[2]: 離開目錄「/home/one/ta-lib/src/tools」
make[1]: 離開目錄「/home/one/ta-lib/src/tools」
make[1]: 進入目錄「/home/one/ta-lib」
make[2]: 進入目錄「/home/one/ta-lib」
test -z "/usr/bin" || /usr/bin/mkdir -p "/usr/bin"
 /usr/bin/install -c 'ta-lib-config' '/usr/bin/ta-lib-config'
make[2]: 對「install-data-am」無需做任何事。
make[2]: 離開目錄「/home/one/ta-lib」
make[1]: 離開目錄「/home/one/ta-lib」

安裝過程無 error 即可. 


6. 用 pip install Ta-Lib 升級到最新版 :

編譯安裝完舊版 Ta-Lib 就可以跳離並刪除 ta-lib 子目錄了 :

one@LX2438:~/ta-lib$ cd ..   
one@LX2438:~$ sudo pip install Ta-Lib    
Collecting Ta-Lib
  Downloading TA-Lib-0.4.25.tar.gz (271 kB)
 272.0/272.0 KB 1.3 MB/s eta 0:00:00
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Installing backend dependencies ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: numpy in /usr/lib/python3/dist-packages (from Ta-Lib) (1.21.5)
Building wheels for collected packages: Ta-Lib
  Building wheel for Ta-Lib (pyproject.toml) ... done
  Created wheel for Ta-Lib: filename=TA_Lib-0.4.25-cp310-cp310-linux_aarch64.whl size=1518950 sha256=c6a2be28b115fd4fce7e21ee625e3056fa658658ae8cdbb201fd0627a2f72ce5
  Stored in directory: /root/.cache/pip/wheels/bd/00/b7/86021ffb1e63d17df0a25e7e5e0ff2a1f94f0a7eb953366eff
Successfully built Ta-Lib
Installing collected packages: Ta-Lib
Successfully installed Ta-Lib-0.4.25
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

用 pip show Ta-Lib 檢視可知已升到最新版 0.4.25 :

one@LX2438:~$ pip show Ta-Lib   
Name: TA-Lib
Version: 0.4.25
Summary: Python wrapper for TA-Lib
Home-page: http://github.com/mrjbq7/ta-lib
Author: John Benediktsson
Author-email: mrjbq7@gmail.com
License: BSD
Location: /usr/local/lib/python3.10/dist-packages
Requires: numpy
Required-by: 

最後用一個簡單的計算五日移動平均值來檢驗一下 Ta-Lib 是否可用 :

Python 3.10.6 (/usr/bin/python3)
>>> import talib   
>>> import numpy as np   
>>> close=np.random.random(30)     
>>> print(talib.SMA(close, 5))       
[       nan        nan        nan        nan 0.69136807 0.72448027
 0.62425612 0.68713407 0.68578759 0.60408337 0.67693753 0.71258124
 0.71956245 0.72228273 0.66785218 0.52727606 0.65132248 0.5209605
 0.47285977 0.4846474  0.52345147 0.43278205 0.48792562 0.44271223
 0.39446687 0.36684241 0.35803496 0.26485917 0.2578122  0.36312063]

收工. 

參考 :


Mapleboard MP510-50 測試 (十四) : 安裝常用 Python 套件

由於我目前主要使用 Python 進行開發測試, 故要先安裝常用的 Python 套件, 主要是爬蟲, 資料科學, 機器學習, 以及財務金融等領域, 這些套件參考下面這篇 : 


本系列全部測試文章參考 :

安裝指令如下 : 

pip install virtualenv
pip install requests  
pip install beautifulsoup4
pip install lxml
pip install html5lib 
pip install selenium
pip install scrapy
pip install scipy
pip install pandas
pip install sympy
pip install matplotlib
pip install seaborn
pip install bokeh
pip install plotly
pip install scikit-learn
pip install Django
pip install Flask
pip install reflex  
pip install twstock
pip install twder
pip install openpyxl
pip install streamlit
pip install gradio

注意, 安裝 SciPy 時會同時安裝 Numpy, 故不需再次安裝 Numpy. 

2023-09-28 補充 :

Windows 安裝 Ta-Lib 方法參考 :


Mapleboard 安裝 Ta-Lib 方法參考 :


2023年2月21日 星期二

Mapleboard MP510-50 測試 (十三) : 安裝 Python 套件時出現 "not on PATH" 警告問題

在前一篇中試圖用 pip install 安裝 Thonny 時出現了 '/home/one/.local/bin' which is not on PATH 的警告訊息, 後來在安裝 Flask 與 Django 套件時也出現了相同問題, 所以我把此問題的解決辦法移到這篇來記錄. 本系列測試文章參考 :


以下是安裝 Flask 套件的紀錄 :

one@LX2438:~$ pip install flask    
Defaulting to user installation because normal site-packages is not writeable
Collecting flask
  Downloading Flask-2.2.3-py3-none-any.whl (101 kB) 101.8/101.8 KB 631.3 kB/s eta 0:00:00
Requirement already satisfied: click>=8.0 in /usr/lib/python3/dist-packages (from flask) (8.0.3)
Collecting itsdangerous>=2.0
  Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting Werkzeug>=2.2.2
  Downloading Werkzeug-2.2.3-py3-none-any.whl (233 kB) 233.6/233.6 KB 3.1 MB/s eta 0:00:00
Collecting Jinja2>=3.0
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB) 133.1/133.1 KB 5.2 MB/s eta 0:00:00
Requirement already satisfied: MarkupSafe>=2.0 in /usr/lib/python3/dist-packages (from Jinja2>=3.0->flask) (2.0.1)
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (26 kB)
Installing collected packages: MarkupSafe, itsdangerous, Werkzeug, Jinja2, flask
  WARNING: The script flask is installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.2 Werkzeug-2.2.3 flask-2.2.3 itsdangerous-2.1.2

雖然出現了  '/home/one/.local/bin' which is not on PATH 警告, 但 Flask 其實是有安裝成功的 :

one@LX2438:~$ python3  
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask     
>>> flask.__version__    
'2.2.3'

下面用 Thonny 來寫一個 Hello World 來測試 Flask 網頁伺服器, 程式如下 :

#hello.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return 'Hello World!'

if __name__ == "__main__":
    app.run(debug=True)

存檔後執行, 然後開啟瀏覽器連線 127.0.0.1:5000, 結果 OK :




安裝 Django 也是一樣出現 The script XXXX is installed in '/home/one/.local/bin' which is not on PATH 的警告訊息 : 

one@LX2438:~$ pip install django   
Defaulting to user installation because normal site-packages is not writeable
Collecting django
  Downloading Django-4.1.7-py3-none-any.whl (8.1 MB)
 8.1/8.1 MB 6.1 MB/s eta 0:00:00
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.4.3-py3-none-any.whl (42 kB)
 42.8/42.8 KB 2.3 MB/s eta 0:00:00
Collecting asgiref<4,>=3.5.2
  Downloading asgiref-3.6.0-py3-none-any.whl (23 kB)
Installing collected packages: sqlparse, asgiref, django
  WARNING: The script sqlformat is installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script django-admin is installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed asgiref-3.6.0 django-4.1.7 sqlparse-0.4.3

爬文在下面這篇文章找到解決辦法 : 


原來只要用下列兩個指令將目前的 bin 路徑加入系統變數 $PATH 中就可以了 :

one@LX2438:~$ echo 'export PATH=/home/one/.local/bin:$PATH' >> ~/.bashrc   
one@LX2438:~$ source ~/.bashrc   

用 echo 指令輸出 $PATH 變數就可以看到目前使用者 one 的執行路徑已被加入 $PATH 中 :

one@LX2438:~$ echo $PATH   
/home/one/.local/bin:/home/one/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

可見 $PATH 中的每個路徑都是以冒號隔開的. 這個 .bashrc 是使用者目錄 (此處為 /home/one) 下的一個隱藏檔, 每次開啟 shell 終端機時就會執行, 此檔案紀錄使用者的環境變數 PATH, 用來指示 shell 要到那些目錄下尋找所執行的命令或程式. 注意, .bashrc 是套用在個別使用者的, 修改其內容只會影響到該使用者. 

注意, 以上的設定后必須在新開啟的終端機中才會有效, 所以我新開一個終端機來安裝另一個套件 virtualenv :

one@LX2438:~$ pip install virtualenv
Defaulting to user installation because normal site-packages is not writeable
Collecting virtualenv
  Downloading virtualenv-20.19.0-py3-none-any.whl (8.7 MB)
 8.7/8.7 MB 5.9 MB/s eta 0:00:00
Requirement already satisfied: platformdirs<4,>=2.4 in ./.local/lib/python3.10/site-packages (from virtualenv) (3.0.0)
Collecting distlib<1,>=0.3.6
  Downloading distlib-0.3.6-py2.py3-none-any.whl (468 kB)
 468.5/468.5 KB 6.3 MB/s eta 0:00:00
Collecting filelock<4,>=3.4.1
  Downloading filelock-3.9.0-py3-none-any.whl (9.7 kB)
Installing collected packages: distlib, filelock, virtualenv
Successfully installed distlib-0.3.6 filelock-3.9.0 virtualenv-20.19.0

果然這個 Warning 訊息就不見了. 

參考 : 

Mapleboard MP510-50 測試 (十二) : 安裝 Python 開發工具 Thonny

搞定了 Mapleboard 的 PPPoE 撥接上網取得光世代固定 IP 后, 就可以開始著手架站了. 因我主要用 Python 進行開發, 所以必須先安裝 Python 開發工具, Mapleboard 的 Ubuntu Mate 預設已安裝 VS Code, 但我還不會用, 所以還是安裝最熟悉的輕量級開發工具 Thonny 吧!

我參考之前在樹莓派的經驗, 以為是要 python3-thonny, 結果找不到此套件 :


one@LX2438:~$ sudo apt-get install python3-thonny   
[sudo] one 的密碼: 
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
E: 找不到套件 python3-thonny  

後來找到下面這篇文章 :


文中介紹了三種在 Linux 上安裝 Thonny 的方法, 我先用 pip 安裝 :

one@LX2438:~$ pip3 install thonny    
Defaulting to user installation because normal site-packages is not writeable
Collecting thonny
  Downloading thonny-4.0.2-py3-none-any.whl (1.9 MB)

......(略)......

  WARNING: The script send2trash is installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts pyserial-miniterm and pyserial-ports are installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts isort and isort-identify-imports are installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script docutils is installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts dmypy, mypy, mypyc, stubgen and stubtest are installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The scripts epylint, pylint, pylint-config, pyreverse and symilar are installed in '/home/one/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed Send2Trash-1.8.0 astroid-2.14.2 asttokens-2.2.1 dill-0.3.6 docutils-0.19 isort-5.12.0 jedi-0.18.2 lazy-object-proxy-1.9.0 mccabe-0.7.0 mypy-1.0.1 mypy-extensions-1.0.0 parso-0.8.3 platformdirs-3.0.0 pylint-2.16.2 pyserial-3.5 thonny-4.0.2 tomli-2.0.1 tomlkit-0.11.6 typing-extensions-4.5.0 wrapt-1.14.1

雖然出現  '/home/one/.local/bin' which is not on PATH 的 Warning 訊息, 但整體來看應該是安裝成功, 但點左上角開始選單進入 "軟體開發" 功能表卻沒看到 Thonny 這軟體, 所以我改用第二種方法, 使用 apt 套件管理器下載安裝, 指令如下 : 

sudo apt install thonny

one@LX2438:~$ sudo apt install thonny    
[sudo] one 的密碼: 
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
下列的額外套件將被安裝:
  blt docutils-common libtk8.6 mypy pylint python3-astroid python3-asttokens
  python3-docutils python3-isort python3-jedi python3-lazy-object-proxy
  python3-logilab-common python3-mccabe python3-mypy python3-mypy-extensions
  python3-parso python3-pip-whl python3-platformdirs python3-pygments
  python3-roman python3-send2trash python3-serial python3-setuptools-whl
  python3-tk python3-toml python3-tomli python3-typed-ast python3-typeshed
  python3-typing-extensions python3-venv python3-wrapt python3.10-venv
  tk8.6-blt2.5 xsel
建議套件:
  blt-demo tk8.6 mypy-doc pylint-doc docutils-doc fonts-linuxlibertine
  | ttf-linux-libertine texlive-lang-french texlive-latex-base
  texlive-latex-recommended python-pygments-doc ttf-bitstream-vera
  python3-wxgtk3.0 | python3-wxgtk tix python3-tk-dbg
下列【新】套件將會被安裝:
  blt docutils-common libtk8.6 mypy pylint python3-astroid python3-asttokens
  python3-docutils python3-isort python3-jedi python3-lazy-object-proxy
  python3-logilab-common python3-mccabe python3-mypy python3-mypy-extensions
  python3-parso python3-pip-whl python3-platformdirs python3-pygments
  python3-roman python3-send2trash python3-serial python3-setuptools-whl
  python3-tk python3-toml python3-tomli python3-typed-ast python3-typeshed
  python3-typing-extensions python3-venv python3-wrapt python3.10-venv thonny
  tk8.6-blt2.5 xsel
升級 0 個,新安裝 35 個,移除 0 個,有 27 個未被升級。
需要下載 21.8 MB 的套件檔。
此操作完成之後,會多佔用 96.5 MB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] Y
下載:1 http://ports.ubuntu.com jammy/main arm64 libtk8.6 arm64 8.6.12-1build1 [777 kB]
下載:2 http://ports.ubuntu.com jammy/main arm64 tk8.6-blt2.5 arm64 2.5.3+dfsg-4.1build2 [625 kB]
下載:3 http://ports.ubuntu.com jammy/main arm64 blt arm64 2.5.3+dfsg-4.1build2 [4,838 B]
下載:4 http://ports.ubuntu.com jammy/main arm64 docutils-common all 0.17.1+dfsg-2 [117 kB]
下載:5 http://ports.ubuntu.com jammy/universe arm64 python3-mypy-extensions all 0.4.3-2 [5,752 B]
下載:6 http://ports.ubuntu.com jammy/universe arm64 python3-tomli all 1.2.2-2 [12.9 kB]
下載:7 http://ports.ubuntu.com jammy/universe arm64 python3-typing-extensions all 3.10.0.2-1 [35.7 kB]
下載:8 http://ports.ubuntu.com jammy/universe arm64 python3-typed-ast arm64 1.4.3-1build1 [165 kB]
下載:9 http://ports.ubuntu.com jammy-updates/universe arm64 python3-mypy arm64 0.942-1ubuntu1 [13.4 MB]
下載:10 http://ports.ubuntu.com jammy-updates/universe arm64 mypy all 0.942-1ubuntu1 [24.5 kB]
下載:11 http://ports.ubuntu.com jammy/universe arm64 python3-lazy-object-proxy arm64 1.7.1-1build1 [19.4 kB]
下載:12 http://ports.ubuntu.com jammy/main arm64 python3-wrapt arm64 1.13.3-1build1 [33.0 kB]
下載:13 http://ports.ubuntu.com jammy/universe arm64 python3-astroid all 2.9.3-1 [159 kB]
下載:14 http://ports.ubuntu.com jammy/universe arm64 python3-toml all 0.10.2-1 [16.5 kB]
下載:15 http://ports.ubuntu.com jammy/universe arm64 python3-isort all 5.6.4-1 [63.1 kB]
下載:16 http://ports.ubuntu.com jammy/universe arm64 python3-logilab-common all 1.8.2-1 [306 kB]
下載:17 http://ports.ubuntu.com jammy/universe arm64 python3-mccabe all 0.6.1-3 [8,488 B]
下載:18 http://ports.ubuntu.com jammy/universe arm64 python3-platformdirs all 2.5.1-1 [14.2 kB]
下載:19 http://ports.ubuntu.com jammy/universe arm64 pylint all 2.12.2-1 [266 kB]
下載:20 http://ports.ubuntu.com jammy/universe arm64 python3-asttokens all 2.0.5-1 [15.1 kB]
下載:21 http://ports.ubuntu.com jammy/main arm64 python3-roman all 3.3-1 [10.6 kB]
下載:22 http://ports.ubuntu.com jammy/main arm64 python3-docutils all 0.17.1+dfsg-2 [387 kB]
下載:23 http://ports.ubuntu.com jammy/universe arm64 python3-parso all 0.8.1-1 [64.5 kB]
下載:24 http://ports.ubuntu.com jammy/universe arm64 python3-jedi all 0.18.0-1 [615 kB]
下載:25 http://ports.ubuntu.com jammy-security/universe arm64 python3-pip-whl all 22.0.2+dfsg-1ubuntu0.1 [1,679 kB]
下載:26 http://ports.ubuntu.com jammy/main arm64 python3-pygments all 2.11.2+dfsg-2 [750 kB]
下載:27 http://ports.ubuntu.com jammy/universe arm64 python3-send2trash all 1.8.1~b0-1 [15.6 kB]
下載:28 http://ports.ubuntu.com jammy/main arm64 python3-serial all 3.5-1 [78.7 kB]
下載:29 http://ports.ubuntu.com jammy-security/universe arm64 python3-setuptools-whl all 59.6.0-1.2ubuntu0.22.04.1 [788 kB]
下載:30 http://ports.ubuntu.com jammy-updates/main arm64 python3-tk arm64 3.10.6-1~22.04 [111 kB]
下載:31 http://ports.ubuntu.com jammy/universe arm64 python3-typeshed all 0.0~git20211009.0142ea8-3 [445 kB]
下載:32 http://ports.ubuntu.com jammy-security/universe arm64 python3.10-venv arm64 3.10.6-1~22.04.2 [5,722 B]
下載:33 http://ports.ubuntu.com jammy-updates/universe arm64 python3-venv arm64 3.10.6-1~22.04 [1,038 B]
下載:34 http://ports.ubuntu.com jammy/universe arm64 thonny all 3.3.14-1 [771 kB]
下載:35 http://ports.ubuntu.com jammy/universe arm64 xsel arm64 1.2.0+git9bfc13d.20180109-3 [19.3 kB]
取得 21.8 MB 用了 13s (1,635 kB/s)                                             
從套件中提取樣板:100%
選取了原先未選的套件 libtk8.6:arm64。
(讀取資料庫 ... 目前共安裝了 279729 個檔案和目錄。)
正在準備解包 .../00-libtk8.6_8.6.12-1build1_arm64.deb……
解開 libtk8.6:arm64 (8.6.12-1build1) 中...
選取了原先未選的套件 tk8.6-blt2.5。
正在準備解包 .../01-tk8.6-blt2.5_2.5.3+dfsg-4.1build2_arm64.deb……
解開 tk8.6-blt2.5 (2.5.3+dfsg-4.1build2) 中...
選取了原先未選的套件 blt。
正在準備解包 .../02-blt_2.5.3+dfsg-4.1build2_arm64.deb……
解開 blt (2.5.3+dfsg-4.1build2) 中...
選取了原先未選的套件 docutils-common。
正在準備解包 .../03-docutils-common_0.17.1+dfsg-2_all.deb……
解開 docutils-common (0.17.1+dfsg-2) 中...
選取了原先未選的套件 python3-mypy-extensions。
正在準備解包 .../04-python3-mypy-extensions_0.4.3-2_all.deb……
解開 python3-mypy-extensions (0.4.3-2) 中...
選取了原先未選的套件 python3-tomli。
正在準備解包 .../05-python3-tomli_1.2.2-2_all.deb……
解開 python3-tomli (1.2.2-2) 中...
選取了原先未選的套件 python3-typing-extensions。
正在準備解包 .../06-python3-typing-extensions_3.10.0.2-1_all.deb……
解開 python3-typing-extensions (3.10.0.2-1) 中...
選取了原先未選的套件 python3-typed-ast。
正在準備解包 .../07-python3-typed-ast_1.4.3-1build1_arm64.deb……
解開 python3-typed-ast (1.4.3-1build1) 中...
選取了原先未選的套件 python3-mypy。
正在準備解包 .../08-python3-mypy_0.942-1ubuntu1_arm64.deb……
解開 python3-mypy (0.942-1ubuntu1) 中...
選取了原先未選的套件 mypy。
正在準備解包 .../09-mypy_0.942-1ubuntu1_all.deb……
解開 mypy (0.942-1ubuntu1) 中...
選取了原先未選的套件 python3-lazy-object-proxy。
正在準備解包 .../10-python3-lazy-object-proxy_1.7.1-1build1_arm64.deb……
解開 python3-lazy-object-proxy (1.7.1-1build1) 中...
選取了原先未選的套件 python3-wrapt。
正在準備解包 .../11-python3-wrapt_1.13.3-1build1_arm64.deb……
解開 python3-wrapt (1.13.3-1build1) 中...
選取了原先未選的套件 python3-astroid。
正在準備解包 .../12-python3-astroid_2.9.3-1_all.deb……
解開 python3-astroid (2.9.3-1) 中...
選取了原先未選的套件 python3-toml。
正在準備解包 .../13-python3-toml_0.10.2-1_all.deb……
解開 python3-toml (0.10.2-1) 中...
選取了原先未選的套件 python3-isort。
正在準備解包 .../14-python3-isort_5.6.4-1_all.deb……
解開 python3-isort (5.6.4-1) 中...
選取了原先未選的套件 python3-logilab-common。
正在準備解包 .../15-python3-logilab-common_1.8.2-1_all.deb……
解開 python3-logilab-common (1.8.2-1) 中...
選取了原先未選的套件 python3-mccabe。
正在準備解包 .../16-python3-mccabe_0.6.1-3_all.deb……
解開 python3-mccabe (0.6.1-3) 中...
選取了原先未選的套件 python3-platformdirs。
正在準備解包 .../17-python3-platformdirs_2.5.1-1_all.deb……
解開 python3-platformdirs (2.5.1-1) 中...
選取了原先未選的套件 pylint。
正在準備解包 .../18-pylint_2.12.2-1_all.deb……
解開 pylint (2.12.2-1) 中...
選取了原先未選的套件 python3-asttokens。
正在準備解包 .../19-python3-asttokens_2.0.5-1_all.deb……
解開 python3-asttokens (2.0.5-1) 中...
選取了原先未選的套件 python3-roman。
正在準備解包 .../20-python3-roman_3.3-1_all.deb……
解開 python3-roman (3.3-1) 中...
選取了原先未選的套件 python3-docutils。
正在準備解包 .../21-python3-docutils_0.17.1+dfsg-2_all.deb……
解開 python3-docutils (0.17.1+dfsg-2) 中...
選取了原先未選的套件 python3-parso。
正在準備解包 .../22-python3-parso_0.8.1-1_all.deb……
解開 python3-parso (0.8.1-1) 中...
選取了原先未選的套件 python3-jedi。
正在準備解包 .../23-python3-jedi_0.18.0-1_all.deb……
解開 python3-jedi (0.18.0-1) 中...
選取了原先未選的套件 python3-pip-whl。
正在準備解包 .../24-python3-pip-whl_22.0.2+dfsg-1ubuntu0.1_all.deb……
解開 python3-pip-whl (22.0.2+dfsg-1ubuntu0.1) 中...
選取了原先未選的套件 python3-pygments。
正在準備解包 .../25-python3-pygments_2.11.2+dfsg-2_all.deb……
解開 python3-pygments (2.11.2+dfsg-2) 中...
選取了原先未選的套件 python3-send2trash。
正在準備解包 .../26-python3-send2trash_1.8.1~b0-1_all.deb……
解開 python3-send2trash (1.8.1~b0-1) 中...
選取了原先未選的套件 python3-serial。
正在準備解包 .../27-python3-serial_3.5-1_all.deb……
解開 python3-serial (3.5-1) 中...
選取了原先未選的套件 python3-setuptools-whl。
正在準備解包 .../28-python3-setuptools-whl_59.6.0-1.2ubuntu0.22.04.1_all.deb……
解開 python3-setuptools-whl (59.6.0-1.2ubuntu0.22.04.1) 中...
選取了原先未選的套件 python3-tk:arm64。
正在準備解包 .../29-python3-tk_3.10.6-1~22.04_arm64.deb……
解開 python3-tk:arm64 (3.10.6-1~22.04) 中...
選取了原先未選的套件 python3-typeshed。
正在準備解包 .../30-python3-typeshed_0.0~git20211009.0142ea8-3_all.deb……
解開 python3-typeshed (0.0~git20211009.0142ea8-3) 中...
選取了原先未選的套件 python3.10-venv。
正在準備解包 .../31-python3.10-venv_3.10.6-1~22.04.2_arm64.deb……
解開 python3.10-venv (3.10.6-1~22.04.2) 中...
選取了原先未選的套件 python3-venv。
正在準備解包 .../32-python3-venv_3.10.6-1~22.04_arm64.deb……
解開 python3-venv (3.10.6-1~22.04) 中...
選取了原先未選的套件 thonny。
正在準備解包 .../33-thonny_3.3.14-1_all.deb……
解開 thonny (3.3.14-1) 中...
選取了原先未選的套件 xsel。
正在準備解包 .../34-xsel_1.2.0+git9bfc13d.20180109-3_arm64.deb……
解開 xsel (1.2.0+git9bfc13d.20180109-3) 中...
設定 xsel (1.2.0+git9bfc13d.20180109-3) ...
設定 python3-setuptools-whl (59.6.0-1.2ubuntu0.22.04.1) ...
設定 python3-send2trash (1.8.1~b0-1) ...
設定 python3-tomli (1.2.2-2) ...
設定 python3-parso (0.8.1-1) ...
設定 python3-pip-whl (22.0.2+dfsg-1ubuntu0.1) ...
設定 python3-typed-ast (1.4.3-1build1) ...
設定 python3-asttokens (2.0.5-1) ...
設定 python3-mypy-extensions (0.4.3-2) ...
設定 libtk8.6:arm64 (8.6.12-1build1) ...
設定 python3-platformdirs (2.5.1-1) ...
設定 python3-serial (3.5-1) ...
設定 python3-roman (3.3-1) ...
設定 python3-pygments (2.11.2+dfsg-2) ...
設定 python3-typeshed (0.0~git20211009.0142ea8-3) ...
設定 python3-wrapt (1.13.3-1build1) ...
設定 python3-typing-extensions (3.10.0.2-1) ...
設定 python3-toml (0.10.2-1) ...
設定 python3-isort (5.6.4-1) ...
設定 docutils-common (0.17.1+dfsg-2) ...
設定 python3-mccabe (0.6.1-3) ...
設定 python3-lazy-object-proxy (1.7.1-1build1) ...
設定 tk8.6-blt2.5 (2.5.3+dfsg-4.1build2) ...
設定 python3.10-venv (3.10.6-1~22.04.2) ...
設定 python3-jedi (0.18.0-1) ...
設定 python3-logilab-common (1.8.2-1) ...
設定 blt (2.5.3+dfsg-4.1build2) ...
設定 python3-tk:arm64 (3.10.6-1~22.04) ...
設定 python3-venv (3.10.6-1~22.04) ...
設定 python3-mypy (0.942-1ubuntu1) ...
設定 python3-astroid (2.9.3-1) ...
設定 mypy (0.942-1ubuntu1) ...
設定 pylint (2.12.2-1) ...
執行 bamfdaemon (0.5.6+22.04.20220217-0ubuntu1) 的觸發程式……
Rebuilding /usr/share/applications/bamf-2.index...
執行 desktop-file-utils (0.26-1ubuntu3) 的觸發程式……
執行 hicolor-icon-theme (0.17-2) 的觸發程式……
執行 gnome-menus (3.36.0-1ubuntu3) 的觸發程式……
執行 mate-menus (1.26.0-2ubuntu2) 的觸發程式……
執行 libc-bin (2.35-0ubuntu3.1) 的觸發程式……
執行 man-db (2.10.2-1) 的觸發程式……
執行 shared-mime-info (2.1-2) 的觸發程式……
執行 sgml-base (1.30) 的觸發程式……
設定 python3-docutils (0.17.1+dfsg-2) ...
執行 mailcap (3.70+nmu1ubuntu1) 的觸發程式……
設定 thonny (3.3.14-1) ...
one@LX2438:~$ 

安裝完成後到 "軟體開發" 功能表就可看到 Thonny 了 :




點擊執行 Thonny, 預設是大工具列按鈕模式, 按右上角的超連結可改成 regular mode. 預設介面是英文, 點選 "Tools/Options", 將 Language 改成繁體中文, 按 OK 后關掉 Thonny 重新開啟即可改成繁中介面了 : 





可見它使用了 Ubuntu Mate 搭載的 Python 3.10.6 解譯器, 預設程式位置是在 /usr/bin/python3, 但可以在 "工具/選項/直譯器" 選單中更改路徑 :




這樣就完成安裝了, 結論是要用 sudo apt 來安裝 Thonny 才對, 不要用 pip