跳到主要內容

發表文章

目前顯示的是有「Python」標籤的文章

簡化 Terraform 狀態遷移:自動化匯入命令產生器

簡化 Terraform 狀態遷移:自動化匯入命令產生器 遇到的問題 狀態遷移可能非常繁瑣且容易出錯,特別是在處理複雜的 Azure 資源時。每個資源都需要特定的匯入命令和唯一的資源 ID,手動建立這些命令既耗時又容易出錯。 解決方案 以下是一個 Python 腳本,可以讀取您的 Terraform 狀態檔並自動生成所有必要的匯入命令: import json import os def read_terraform_files(state_path, code_path): try: # 檢查檔案是否存在 if not os.path.exists(state_path): raise FileNotFoundError(f"找不到狀態檔:{state_path}") if not os.path.exists(code_path): raise FileNotFoundError(f"找不到程式碼檔:{code_path}") # 讀取檔案 with open(state_path, 'r') as f: state_data = json.load(f) with open(code_path, 'r') as f: tf_code = f.read() return state_data, tf_code except json.JSONDecodeError: raise ValueError("無效的狀態檔格式") except Exception as e: raise Exception(f"讀取檔案時發生錯誤:{str(e)}") def extract_resource_ids(state_data, tf_code): import...

如何從 requirements.txt 載入套件並用於 setup.py

如何從 requirements.txt 載入套件並用於 setup.py 在 Python 開發中,套件管理是專案維護的重要一環。當我們使用 setuptools 來建立 Python 套件時,通常會在 setup.py 中指定 install_requires 來管理專案的套件。 然而,當專案的套件數量較多時,直接在 setup.py 內手動列出所有套件可能不太方便。因此,我們可以將套件整理到 requirements.txt ,然後在 setup.py 內動態讀取,確保專案的套件統一且易於維護。 setup.py 是什麼? setup.py 是 Python 套件的安裝與發佈腳本,負責定義套件名稱、版本、依賴關係,並支援打包與發佈。開發者可以透過 pip install . 安裝專案,或使用 python setup.py sdist bdist_wheel 來打包套件,甚至上傳至 PyPI 讓其他人使用。 讀取 requirements.txt 並加到 setup.py 我們可以使用以下方式,在 setup.py 內讀取 requirements.txt 內容,並將其設為 install_requires : from setuptools import setup # 讀取 requirements.txt with open('requirements.txt') as fid: requires = [line.strip() for line in fid] setup( name="my_package", version="0.1", install_requires=requires, packages=["my_package"] ) requirements.txt 內容範例 我們的 requirements.txt 可能會長這樣: numpy>=1.21.0 pandas==1.3.5 requests numpy>=1.21.0 表示至少需要 1.21.0 版本的 NumPy。 pandas==1.3.5 限...

Run notebook in Airflow

  The simplest way to achieve this goal is using KubernetesPodOperator to execute papermill command. For example run_notebook = kubernetes_pod_operator.KubernetesPodOperator( task_id=f"run-notebook", name=f"run-notebook", namespace='default', is_delete_operator_pod=True, image_pull_policy="IfNotPresent", startup_timeout_seconds=3600, cmds=['/bin/bash'], arguments=["-c", """ echo y | conda create --name=runenv python=3.8 source /opt/conda/etc/profile.d/conda.sh conda activate runenv conda install ipykernel python -m ipykernel install --user --name=runenv papermill \ "{{dag_run.conf['nbIn']}}" \ "{{dag_run.conf['nbOut']}}" \ ...

如何佈署Python Web 服務 - How to deploy Flask web app with WSGI + Nginx

需要 Gunicorn Nginx Step 1. 部屬Flask app程式碼 複製程式碼到指定位置 e.g /var/www/flaskapp $ sudo mkdir /var/www/flaskapp $ sudo chmod 777 /var/www/flaskapp Step 2. 安裝WSGI Server (Gunicorn)  安裝 sudo apt-get install gunicorn or pip install gunicorn Step 3. 安裝web server (Nginx) sudo apt-get install nginx 設定 sudo vim /etc/nginx/site-avalidable/default 將內容改成如下 server {     listen 80;     server_name 10.36.172.142; # external domain name     location / {         proxy_pass http://0.0.0.0:5678 ; # point to gunicorn host address         proxy_set_header Host $host;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;     }   } 啟動 sudo service ng...

Python 上使用 .env 管理環境變數

前言 為了不讓帳號密碼等敏感資訊被寫死在程式碼中,  一般的作法通常是選擇在程式runtime時再去讀環境變數 app.py PYENV = os.environ.get( 'PYENV' ) if PYENV == 'dev' :    print('develop mode')     #do something ... ACCOUNT = os.environ.get( 'ACCOUNT' ) PWD = os.environ.get( 'PWD' ) .bashrc export PYENV=dev export ACCOUNT=andy export PWD=123456 ... 但在開發環境裡, 相同的變數卻同時被多個不同的程式使用時, 直接去使用環境變數就會變成一個問題 使用 python-dotenv 針對這種情況, 可以將所有的變數寫到.env裡面 python-dotenv 會自動幫我們把.env裏頭的值讀進來變成環境變數 .env PYENV=dev ACCOUNT=andy PWD=123456 安裝 可以使用以下指令安裝 pip install -U python-dotenv

python unit test 單元測試

前言: 隨著專案越寫越大, 我們不可能時常有美國時間做人體debug, 所以Unit Test 的必要性也日益增加, 以下是簡單的介紹, 如何使用python 做單元測試 假設我有一隻 db_helper.py 負責與資料庫溝通, 為了方便說明, 程式碼簡化如下 def get_user_data():      return 'andy lai' Step 1.下載 pytest 模組 $ pip install pytest Step 2. 建立測試腳本 test_mypython.py 此時的工作目錄下有以下這些檔案 db_helper.py test_mypython.py 注意: pytest 會去掃資料夾下 test_ 開頭的所有 python 腳本執行測試, 所以任何測試腳本務必前置 test Step 3. 撰寫測試程式 我們預期呼叫db_helper.get_user_data()之後會得到 'andy lai' import db_helper def test_verify_get_user_data():     expect = 'andy lai'     result = db_helper.get_user_data()     assert expect == result Step 4. 開始測試 在你的工作目錄下執行pytest $ python -m pytest 這個指令的作用等於是, 將目前的工作目錄下所有檔案都掃一遍, 名稱含有test的檔案就會被執行測試 結果: 加入 中斷點除錯 單元測試的過程中有辦法加入 中斷點除錯 嗎? 答案是"可以" 程式需修改如下 import db_helper def test_verify_get_user_data():     expect = 'andy lai'     result = db_helper.get_user_data() ...

Python within Visual Studio Code

How to set your VS Code to run Python Step 1. Intall Python Lintin Extension for VS code Step 2. Add the following configuratio to task.json {     "version" : "0.1.0" ,     "command" : "c:\\Python34\\python" ,     "args" : [ "app.py" ],     "problemMatcher" : {         "fileLocation" : [ "relative" , "${workspaceRoot}" ],         "pattern" : {             "regexp" : "^(.*)+s$" ,             "message" : 1         }     } } Done.

使用DirectLine API 實作Client應用程式來串接Chat Bot

基本上MS的Bot framework 本來就提供了許多Channel 讓我們的bot 可以自由地選擇想要串接的平台 像是 Skype, Facebook messager, Slake 等等 但若是想自己開發一個client端的應用程式去串接Bot 那實際上我們可以透過DirectLine chenel 來達成 目前DirectLine 已經提供完整的REST API 讓我們呼叫 所以要實作一個能夠與Bot對話的client 應用程式其實不難 首先: 需要一組Secret key 用來當作每個conversation的鑰匙 (注意:底下的說明使用Python語言) 第一步: 開啟對話 使用底下的url       API_ENDPOINT = "https://directline.botframework.com/v3/directline/conversations" 並且在 Header 裡面加入你的secret key  headers = { 'Authorization' : 'Bearer ' + API_KEY} 然後再POST      # sending post request and saving response as response object      responds = requests.post(url = API_ENDPOINT, headers = headers)   如果有成功開啟一個 conversation的話 就會得到一個 consersation id(當我們收送訊息時都會用到他) 第二步: 送訊息給Bot 使用底下的 url      # defining the api-endpoint      send_api_endpoint = " h...