Python學習筆記

2022/08/28

安裝

# 安裝python3
sudo apt-get install python3 -y

# 安裝pip
sudo apt-get install build-essential libssl-dev libffi-dev python-dev python3-pip -y

# 確認安裝版本
python --version
pip --version

# 若上述方式裝起來是3.8, 可使用以下方式裝3.9
sudo apt-get install python3.9 -y
sudo ln -sf /usr/bin/python3.9 /usr/bin/python3
python --version
sudo apt-get install python3.9-venv -y

 

相依性

pip為python套件管理工具

類似於js的npm或php的composer

 

列出系統所有安裝的python套件(包含自帶套件例如pip)

pip list

 

列出系統所有安裝的python套件(不包含自帶套件)

pip freeze

 

requirements.txt

通常都會使用requirements.txt檔案來紀錄安裝的套件及版本

因此可直接使用以下指令將套件安裝資訊dump至requirements.txt檔案中

pip freeze > requirements.txt

 

亦可透過requirements.txt來安裝該檔案內的所有套件及版本

pip install -r requirements.txt

 

venv虛擬環境

# pip安裝virtualenv
pip install virtualenv

# 建立虛擬環境目錄
virtualenv venv

# 啟動虛擬環境
source venv/bin/activate

# 啟動虛擬環境(fish shell)
. venv/bin/activate.fish

# 在venv中使用最新的pip
pip install --upgrade pip

# 在虛擬環境中使用pip安裝套件
venv/bin/pip install [package-name]

 

ENV

先安裝python-dotenv

pip install python-dotenv

 

建立一個.env檔案

DB_HOST=localhost
DB_USERNAME=username
DB_PASSWORD=password
DB_DATABASE_NAME=db

 

使用dotenv_values來取得環境變數

import pymysql.cursors
from dotenv import dotenv_values
config = dotenv_values(".env")

# Connect to the database
connection = pymysql.connect(host=config['DB_HOST'],
                             user=config['DB_USERNAME'],
                             password=config['DB_PASSWORD'],
                             database=config['DB_DATABASE_NAME'],
                             cursorclass=pymysql.cursors.DictCursor)

 

或是直接使用load_dotenv將.env檔案載入為環境變數

import os
from dotenv import load_dotenv
load_dotenv()
print(f"GOOGLE_APPLICATION_CREDENTIALS = {os.getenv('GOOGLE_APPLICATION_CREDENTIALS')}")

 

MySQL

import pymysql.cursors
from dotenv import dotenv_values
config = dotenv_values(".env")

# Connect to the database
connection = pymysql.connect(host=config['DB_HOST'],
                             user=config['DB_USERNAME'],
                             password=config['DB_PASSWORD'],
                             database=config['DB_DATABASE_NAME'],
                             cursorclass=pymysql.cursors.DictCursor)

with connection:
    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `name` FROM `site_admin`"
        cursor.execute(sql, ())
        result = cursor.fetchall()
        print(result)

 

Flask

 

安裝

參考文件: https://flask.palletsprojects.com/en/2.2.x/installation/

sudo apt install python3.8-venv -y
python3 -m venv venv

 

app.py(主要程式碼)

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

 

啟動虛擬環境

. venv/bin/activate

 

啟動開發環境

# 啟動app.py
flask --app app.py run

# 啟動app.py並啟用debugger
flask --app app.py --debug run

 

 

Flask容器化

 

安裝gunicorn

pip install gunicorn

 

Dockerfile

FROM python:3.8-slim

ENV APP_HOME /path-to-your-service

WORKDIR $APP_HOME
COPY . /$APP_HOME

# Install production dependencies.
RUN pip install --no-cache-dir -r requirements.txt

ENTRYPOINT ["sh", "docker/entrypoint.sh"]

 

docker/entrypoint

假設flask main.py路徑為/path-to-your-service/app/main.py

並在main.py中使用app = Flask(__name__)指定flask instance為app

則gunicorn執行指令的argument為app.main:app (目錄用"."做區隔, 最後用":"接上flask instance name)

#!/bin/sh

echo "Start Server"

exec gunicorn \
  --bind :8080 \
  --workers 1 \
  --threads 8 \
  --pythonpath /path-to-your-service \
  --timeout 0 \
  app.main:app

 

String Formatting

 

Old School

name = 'ciao'
age = 30
return "name: %s, age: %s" % (name, age)

 

Python3新用法

# 一般用法(f)
name = 'ciao'
age = 30
print(f"name: {name}, age: {age}")

# 一般用法(F)
name = 'ciao'
age = 30
print(F"name: {name}, age: {age}")

# 多行
name = 'ciao'
age = 30
message = f"""
name: {name} 
age: {age}.
"""

print(message)

 

其他字串處理

# string repeat
a = '*'*5
print(a)
# output: *****

# template string
b = f"1 + 2 + 3 = {1+2+3}"
print(b)
# output: 1 + 2 + 3 = 6