-
在使用 json.dumps() 时出现中文乱码,通常是因为默认情况下 json.dumps() 会将非 ASCII 字符(如中文)转义为 Unicode 编码(如 \u4e2d\u6587)。以下是几种解决方法:方法 1:设置 ensure_ascii=Falseimport json payload = {"name": "中文", "value": 123} json_str = json.dumps(payload, ensure_ascii=False) print(json_str) # 输出: {"name": "中文", "value": 123} 作用:禁用 ASCII 转义,直接输出中文字符。注意:确保你的输出环境(如终端、文件)支持 UTF-8 编码。方法 2:指定文件编码(写入文件时)如果将 JSON 写入文件,需指定文件编码为 utf-8:with open("data.json", "w", encoding="utf-8") as f: json.dump(payload, f, ensure_ascii=False, indent=4) 方法 3:处理已转义的字符串如果已经生成了包含 \uXXXX 的字符串,可以通过以下方式还原中文:json_str = '{"name": "\\u4e2d\\u6587"}' parsed_dict = json.loads(json_str) # 先解析为字典 json_str_readable = json.dumps(parsed_dict, ensure_ascii=False) # 重新生成可读字符串 print(json_str_readable) # 输出: {"name": "中文"} 方法 4:检查环境编码确保你的 Python 脚本文件、终端或 IDE 的编码为 UTF-8:在脚本开头添加编码声明(Python 2 需要,Python 3 默认 UTF-8):# -*- coding: utf-8 -*- 常见问题排查终端显示乱码:确认终端支持 UTF-8(如 Windows 的 CMD 需要 chcp 65001)。文件打开乱码:用支持 UTF-8 的编辑器(如 VS Code、Notepad++)打开文件。HTTP 接口返回乱码:确保响应头包含 Content-Type: application/json; charset=utf-8。总结推荐方案:始终使用 ensure_ascii=False 并确保环境编码为 UTF-8。写入文件:加上 encoding="utf-8" 参数。这样可以彻底解决 JSON 中的中文乱码问题。
-
[互动交流] 【问题咨询:如何在鸿蒙系统的笔记本上安装python包】鸿蒙操作系统笔记本 使用 code art ide 时,安装python包时报错,无法自动识别pip,使用python -m pip install --user 安装时报错鸿蒙操作系统笔记本 使用 code art ide 时,安装python包时报错,无法自动识别pip,使用python -m pip install --user 安装时报错.1.在hishell 无法识别python 2.在code art ide 的终端可以识别python 但无法识别pip 3.使用 python -m pip install --user numpy 报错
-
本地部署DeepSeek构建本地知识库实操指导 中3.2RAG向量数据库构建,进入到目录后在终端复制以下命令下载相应环境包:pip install -r requirements.txt。这条指令老是失败,找不到原因。我是新人小白,想自学一些AI方面的技能,结果第一堂课就把我难住了,现在寝食难安,求哪位老铁指导一下。跪谢!
-
1 引言在进行数据存储和管理时,我们常常需要一个轻量级而又功能强大的数据库系统。SQLite 是一个极受欢迎的轻量级数据库,它被广泛应用于各种大小的项目中。Python 自带了对 SQLite 的支持,使得在 Python 中使用 SQLite 变得非常简单和直观。本文将详细介绍 Python 中如何使用 SQLite3 库进行数据库操作。2 SQLite3 简介SQLite 是一个基于 C 语言的轻量级 SQL 数据库引擎。它不需要独立的服务器进程,数据库完整地存储在一个磁盘文件中。Python 标准库中的 sqlite3 模块提供了一个与 SQLite 数据库交互的接口。3 基本步骤使用 SQLite3 模块主要包括以下几个步骤:连接数据库创建表插入数据查询数据更新/删除数据关闭数据库连接4 示例代码4.1 连接数据库1234import sqlite3 # 连接到数据库(如果不存在,则创建)conn = sqlite3.connect('example.db')4.2 创建表123456# 创建一个 Cursor 对象cursor = conn.cursor() # 创建表cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')4.3 插入数据123456# 插入数据cursor.execute("INSERT INTO users (name, age) VALUES ('Alice', 30)")cursor.execute("INSERT INTO users (name, age) VALUES ('Bob', 25)") # 提交事务conn.commit()4.4 查询数据123# 查询数据cursor.execute("SELECT * FROM users")print(cursor.fetchall())4.5 更新/删除数据12345678# 更新数据cursor.execute("UPDATE users SET age = 31 WHERE name = 'Alice'") # 删除数据cursor.execute("DELETE FROM users WHERE name = 'Bob'") # 提交事务conn.commit()4.6 关闭数据库连接123# 关闭 Cursor 和 Connectioncursor.close()conn.close()注意事项异常处理:在进行数据库操作时,使用 try...except 语句处理异常是一个好习惯。事务管理:使用 commit() 来保存更改,使用 rollback() 来撤销未提交的事务。数据库安全:避免 SQL 注入攻击,最好使用参数化查询。5 实例演示以下是一个使用 Python 中的 sqlite3 模块来操作 SQLite 数据库的完整示例。这个例子将展示如何连接到数据库、创建表、插入、查询、更新、删除数据,并最终关闭数据库连接。我们将这些操作封装在一个名为 sqlite_example.py 的 Python 文件中。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107# sqlite_example.pyimport sqlite3 def create_connection(db_file): """ 创建数据库连接 """ conn = None try: conn = sqlite3.connect(db_file) return conn except sqlite3.Error as e: print(e) return conn def create_table(conn): """ 创建表 """ try: cursor = conn.cursor() cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''') except sqlite3.Error as e: print(e) def insert_user(conn, user): """ 插入新用户 """ try: cursor = conn.cursor() cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", user) conn.commit() except sqlite3.Error as e: print(e) def update_user(conn, user): """ 更新用户信息 """ try: cursor = conn.cursor() cursor.execute("UPDATE users SET age = ? WHERE name = ?", user) conn.commit() except sqlite3.Error as e: print(e) def delete_user(conn, name): """ 删除用户 """ try: cursor = conn.cursor() cursor.execute("DELETE FROM users WHERE name = ?", (name,)) conn.commit() except sqlite3.Error as e: print(e) def select_all_users(conn): """ 查询所有用户 """ try: cursor = conn.cursor() cursor.execute("SELECT * FROM users") rows = cursor.fetchall() for row in rows: print(row) except sqlite3.Error as e: print(e) def main(): database = "example.db" # 创建数据库连接 conn = create_connection(database) # 创建表 if conn is not None: create_table(conn) # 插入数据 insert_user(conn, ('Alice', 30)) insert_user(conn, ('Bob', 25)) # 更新数据 update_user(conn, (35, 'Alice')) # 查询数据 print("查询到的所有用户:") select_all_users(conn) # 删除数据 delete_user(conn, 'Bob') # 再次查询数据 print("\n删除后的用户数据:") select_all_users(conn) # 关闭数据库连接 conn.close() else: print("Error! 无法创建数据库连接。") if __name__ == '__main__': main() """ 控制台输出结果:查询到的所有用户: (1, 'Alice', 35) (2, 'Alice', 35) (3, 'Bob', 25) 删除后的用户数据: (1, 'Alice', 35) (2, 'Alice', 35) """在这个脚本中,我们定义了不同的函数来处理数据库的创建连接、创建表、插入、更新、删除和查询操作。main 函数中整合了这些操作的流程。运行这个脚本将在同目录下创建一个名为 example.db 的 SQLite 数据库文件,并在其中执行了一系列的数据库操作。TIPS可以通过数据库浏览器查询创建的数据库,
-
为什么需要个人笔记管理器在当今信息爆炸的数字时代,每天我们都会接触到海量的知识和信息。研究表明,一个普通上班族平均每天要处理超过100条各类信息。如何高效地组织和检索这些信息,成为现代人必须面对的挑战。Markdown作为一种轻量级标记语言,因其简洁的语法和出色的兼容性,已经成为技术文档撰写和日常笔记记录的事实标准。它的纯文本特性使其具备极佳的跨平台性,无论是Windows、macOS还是Linux系统都能完美支持,且文件大小通常只有几KB,非常适合作为个人知识管理的基础格式。本文将详细指导你使用Python构建一个功能完备的命令行笔记管理器。这个工具具有以下核心特点:完全基于命令行操作,无需图形界面使用纯文本文件存储数据,无需安装数据库支持笔记的增删改查基本功能采用模块化设计,便于后续功能扩展特别值得一提的是,这个项目非常适合编程新手作为第一个完整的Python应用来实践,你将会学习到:文件读写操作命令行参数解析正则表达式应用基本的异常处理整个项目代码量控制在200行以内,但涵盖了软件开发的核心流程,是理解程序如何从想法到实现的绝佳案例。核心功能设计我们的笔记管理器将实现以下基础功能:笔记创建功能快速新建Markdown文件:支持一键创建新的Markdown文档,自动生成基本文档结构(包含标题、日期等元信息)多种创建方式:快捷键操作(如Ctrl+N)命令行快速创建(note new 文件名)右键菜单选项智能命名:支持自动生成文件名(基于时间戳或首行标题)集成系统默认编辑器:自动调用用户设置的默认文本编辑器(如VS Code、Sublime Text等)编辑特性:语法高亮支持实时保存机制版本历史记录(可选)多编辑器支持:可配置使用不同编辑器打开特定类型的文档按日期自动分类存储:文件按"年/月/日"层级自动归档目录结构示例:notes/├── 2023/│ ├── 01/│ │ ├── 15_meeting-notes.md│ │ └── 20_project-ideas.md│ └── 02/│ └── 03_daily-journal.md└── 2024/ └── ...自定义分类:支持按项目、标签等附加分类方式基于关键词快速定位:支持以下搜索方式:单关键词搜索(如"会议")多关键词组合搜索(如"项目 + 进度")正则表达式搜索搜索范围:可限定特定日期范围或目录层级搜索结果展示:高亮显示匹配内容,并显示上下文片段终端渲染Markdown基础格式:在终端中直接预览渲染效果,支持:标题级别显示列表项缩进代码块高亮简单表格渲染预览模式:支持以下两种方式:实时预览(分屏显示)静态渲染(执行命令后输出渲染结果)会议记录:快速创建笔记 → 编辑内容 → 自动归档 → 后续可通过关键词搜索查找学习笔记:结构化存储学习资料 → 终端预览复习 → 按日期追踪学习进度项目管理:分类管理各项目文档 → 快速检索相关文件 → 团队成员共享笔记目录graph TD A[用户输入命令] --> B[创建笔记] A --> C[搜索笔记] A --> D[编辑笔记] A --> E[预览笔记] B --> F[按日期存储] C --> G[关键词匹配]环境准备确保安装Python 3.6+,无需额外库:12python --version # 检查版本mkdir md_notes && cd md_notes # 创建项目目录代码实现(分模块讲解)1. 文件管理模块1234567891011import osfrom datetime import datetime NOTE_DIR = "notes" def init_storage(): """创建按日期分类的存储目录""" today = datetime.now().strftime("%Y-%m-%d") daily_dir = os.path.join(NOTE_DIR, today) os.makedirs(daily_dir, exist_ok=True) return daily_dir2. 笔记创建功能1234567891011121314def create_note(): """创建新笔记并打开编辑器""" note_dir = init_storage() title = input("输入笔记标题: ").strip() filename = f"{title.replace(' ', '_')}.md" filepath = os.path.join(note_dir, filename) with open(filepath, 'w') as f: f.write(f"# {title}\n\n创建时间: {datetime.now()}\n\n") # 调用系统默认编辑器 editor = os.getenv('EDITOR', 'vim') # Windows可改为'notepad' os.system(f"{editor} {filepath}") print(f"笔记已保存至: {filepath}")3. 搜索功能实现1234567891011def search_notes(keyword): """全文搜索关键词""" matches = [] for root, _, files in os.walk(NOTE_DIR): for file in files: if file.endswith(".md"): path = os.path.join(root, file) with open(path, 'r') as f: if keyword.lower() in f.read().lower(): matches.append(path) return matches4. 终端预览功能12345678910def preview_note(filepath): """在终端显示Markdown基础渲染""" from rich.markdown import Markdown from rich.console import Console with open(filepath, 'r') as f: content = f.read() console = Console() console.print(Markdown(content))主程序逻辑1234567891011121314151617181920212223import argparse def main(): parser = argparse.ArgumentParser(description="Markdown笔记管理器") subparsers = parser.add_subparsers(dest='command') # 创建子命令 create_parser = subparsers.add_parser('new', help='创建新笔记') search_parser = subparsers.add_parser('search', help='搜索笔记') search_parser.add_argument('keyword', help='搜索关键词') args = parser.parse_args() if args.command == 'new': create_note() elif args.command == 'search': results = search_notes(args.keyword) print(f"找到{len(results)}条匹配记录:") for r in results: print(f"- {r}") if __name__ == "__main__": main()使用示例# 创建笔记python notes.py new输入笔记标题: Python学习笔记# 搜索笔记python notes.py search 装饰器找到3条匹配记录:- notes/2023-08-15/Python高级技巧.md- notes/2023-08-18/设计模式实践.md
-
Flask详解Flask简介Flask是一个用Python编写的轻量级Web应用框架。它被称为“微框架”,因为它不包含ORM(对象关系映射)、表单验证等开箱即用的功能。相反,Flask提供了核心功能,并允许开发者根据项目需求自由选择和集成各种扩展。这使得Flask非常灵活,适合构建小型应用、API服务以及作为大型项目中的微服务。安装和基础配置安装Flask非常简单,通常使用pip进行安装:1pip install Flask核心概念Werkzeug:一个WSGI(Web Server Gateway Interface)工具包,用于处理HTTP请求和响应。Jinja2:一个现代的、设计友好的Python模板引擎,用于渲染HTML页面。路由(Routing):将URL映射到Python函数。视图函数(View Function):处理请求并返回响应的Python函数。模板(Templates):用于生成HTML的文本文件,通常使用Jinja2语法。路由和视图Flask使用@app.route()装饰器来定义路由和视图函数:1234567from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello, World!'if __name__ == '__main__': app.run(debug=True)模板系统Flask使用Jinja2作为其模板引擎。你可以在templates文件夹中创建HTML文件,并在视图函数中渲染它们:1234567from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello, World!'if __name__ == '__main__': app.run(debug=True)templates/user.html:123456789<!DOCTYPE html><html><head> <title>User Page</title></head><body> <h1>Hello, {{ name }}!</h1></body></html>数据库集成Flask本身不提供数据库集成,但可以通过各种扩展来支持。例如,可以使用Flask-SQLAlchemy来集成SQLAlchemy ORM:pip install Flask-SQLAlchemy1234567891011121314151617181920212223242526from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'db = SQLAlchemy(app)class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return '<User %r>' % self.usernamewith app.app_context(): db.create_all()# 示例:添加用户# with app.app_context():# admin = User(username='admin', email='admin@example.com')# db.session.add(admin)# db.session.commit()# 示例:查询用户# with app.app_context():# user = User.query.filter_by(username='admin').first()# print(user.email)if __name__ == '__main__': app.run(debug=True)实际示例下面是一个简单的Flask应用,演示了如何创建一个Web页面并显示一些数据:首先,创建一个名为app.py的文件:1234567891011from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def index(): data = { 'title': '我的Flask应用', 'items': ['项目A', '项目B', '项目C'] } return render_template('index.html', data=data)if __name__ == '__main__': app.run(debug=True)然后,在与app.py同级目录下创建一个名为templates的文件夹,并在其中创建一个名为index.html的文件:1234567891011121314<!DOCTYPE html><html><head> <title>{{ data.title }}</title></head><body> <h1>{{ data.title }}</h1> <ul> {% for item in data.items %} <li>{{ item }}</li> {% endfor %} </ul></body></html>运行应用:python app.py在浏览器中访问http://127.0.0.1:5000/,你将看到一个包含标题和列表的页面。Streamlit详解Streamlit简介Streamlit是一个开源的Python库,它允许数据科学家和机器学习工程师快速创建交互式Web应用,而无需Web开发经验。Streamlit的特点是简单、快速,只需几行Python代码就能将数据脚本、模型和可视化转换为可分享的Web应用。安装和基础配置安装Streamlit非常简单,通常使用pip进行安装:1pip install streamlit运行Streamlit应用:1streamlit run your_app.py核心概念基于脚本:Streamlit应用是Python脚本,每次用户交互(如滑动、输入)都会重新运行整个脚本。数据流:Streamlit通过缓存机制优化数据处理,避免重复计算。Widget:Streamlit提供了丰富的UI组件(如滑块、按钮、文本输入框),用于用户交互。组件和布局Streamlit提供了多种组件和布局选项,可以轻松构建复杂的界面:1234567891011121314151617181920212223import streamlit as stst.title("我的Streamlit应用")st.header("这是一个标题")st.subheader("这是一个副标题")st.write("Hello, Streamlit!")name = st.text_input("请输入你的名字")if name: st.write(f"你好, {name}!")number = st.slider("选择一个数字", 0, 100, 50)st.write(f"你选择的数字是: {number}")option = st.selectbox( "你喜欢哪种水果?", ("苹果", "香蕉", "橙子"))st.write(f"你选择的水果是: {option}")# 布局col1, col2 = st.columns(2)with col1: st.header("第一列") st.write("这是第一列的内容。")with col2: st.header("第二列") st.write("这是第二列的内容。")数据可视化Streamlit与流行的Python数据可视化库(如Matplotlib、Plotly、Altair)无缝集成,可以轻松展示数据:12345678910111213141516import streamlit as stimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltst.title("数据可视化示例")# 生成一些随机数据data = pd.DataFrame( np.random.randn(20, 3), columns=["a", "b", "c"])st.line_chart(data)# 使用Matplotlib绘制图表st.subheader("Matplotlib图表")fig, ax = plt.subplots()ax.scatter(data["a"], data["b"])st.pyplot(fig)实际示例下面是一个简单的Streamlit应用,用于展示一个随机生成的数据表格和图表:首先,创建一个名为my_streamlit_app.py的文件:123456789101112131415161718import streamlit as stimport pandas as pdimport numpy as npst.title("随机数据生成器")# 用户输入生成数据的大小num_rows = st.slider("选择行数", 10, 100, 50)# 生成随机数据data = pd.DataFrame( np.random.randn(num_rows, 5), columns=["A", "B", "C", "D", "E"])st.subheader("原始数据")st.dataframe(data)st.subheader("数据折线图")st.line_chart(data)# 显示一些统计信息st.subheader("数据统计")st.write(data.describe())运行应用:streamlit run my_streamlit_app.py在浏览器中,你将看到一个交互式的数据应用,可以调整行数并实时查看数据表格和折线图的变化。FastAPI详解FastAPI简介FastAPI是一个现代、高性能的Web框架,用于使用Python 3.7+构建API。它基于标准的Python类型提示,并利用Starlette(用于Web部分)和Pydantic(用于数据部分)来提供出色的性能和开发体验。FastAPI的主要特点包括:高性能:与Node.js和Go相当,得益于Starlette和Pydantic。快速开发:减少了大约20%的开发时间。更少的Bug:减少了大约40%的人为错误。直观:强大的编辑器支持,代码补全。健壮:自动生成交互式API文档(Swagger UI和ReDoc)。基于标准:基于OpenAPI和JSON Schema。安装和基础配置安装FastAPI及其推荐的ASGI服务器Uvicorn:1pip install fastapi uvicorn核心概念Pydantic:用于数据验证、设置和文档的Python库。FastAPI使用它来定义请求体和响应模型。Starlette:一个轻量级的ASGI框架/工具包,FastAPI在其之上构建。类型提示(Type Hints):Python 3.5+引入的特性,用于声明变量类型。FastAPI广泛使用它们来提供数据验证、序列化和自动文档。路径操作(Path Operations):定义API端点和HTTP方法。路径操作FastAPI使用装饰器来定义路径操作,类似于Flask的路由:123456789from fastapi import FastAPIapp = FastAPI()@app.get("/")async def read_root(): return {"Hello": "World"}@app.get("/items/{item_id}")async def read_item(item_id: int, q: str | None = None): return {"item_id": item_id, "q": q}运行应用:uvicorn main:app --reload数据验证FastAPI利用Pydantic进行数据验证。你可以定义Pydantic模型来处理请求体:1234567891011from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class Item(BaseModel): name: str description: str | None = None price: float tax: float | None = None@app.post("/items/")async def create_item(item: Item): return item异步支持FastAPI原生支持异步(async/await),这使得它在处理I/O密集型任务时表现出色:1234567from fastapi import FastAPIimport asyncioapp = FastAPI()@app.get("/async_data/")async def get_async_data(): await asyncio.sleep(1) # 模拟异步I/O操作 return {"data": "这是异步数据"}实际示例下面是一个简单的FastAPI应用,演示了如何创建一个带有数据验证的API:首先,创建一个名为main.py的文件:12345678910111213141516from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class Product(BaseModel): name: str price: float is_available: bool = True@app.post("/products/")async def create_product(product: Product): return {"message": "产品创建成功", "product": product}@app.get("/products/{product_name}")async def get_product(product_name: str): # 实际应用中会从数据库查询 if product_name == "apple": return Product(name="apple", price=1.0, is_available=True) return {"message": "产品未找到"}运行应用:uvicorn main:app --reload打开浏览器访问 http://127.0.0.1:8000/docs,你将看到自动生成的Swagger UI文档,可以测试API。框架对比特性FlaskStreamlitFastAPI类型微框架,Web应用和API数据应用和仪表板API框架,高性能Web服务学习曲线中等,需要了解Web开发基础低,Python脚本即可中等,需要了解异步编程和类型提示性能良好,但不如FastAPI适用于数据展示,非高并发Web服务极高,与Node.js和Go相当主要用途传统Web应用、小型API、微服务数据科学应用、机器学习演示、仪表板高性能API、微服务、数据服务异步支持不原生支持,需借助扩展不适用原生支持async/await数据验证需借助扩展(如WTForms、Marshmallow)内置UI组件提供简单验证基于Pydantic,自动数据验证和序列化自动文档无,需借助扩展(如Flask-RESTX)无内置Swagger UI和ReDoc生态系统成熟,大量扩展和社区支持活跃,专注于数据科学领域快速增长,得益于Starlette和Pydantic最佳实践选择合适的框架:如果你需要构建一个传统的Web应用,或者一个轻量级的API服务,并且希望有更大的灵活性和控制权,Flask是一个不错的选择。如果你是一名数据科学家或机器学习工程师,希望快速将数据分析、模型演示或交互式仪表板部署为Web应用,而不想深入Web开发细节,Streamlit是你的首选。如果你需要构建高性能的API服务,对性能有较高要求,并且希望利用Python的类型提示进行数据验证和自动文档生成,FastAPI是最佳选择。项目结构:对于Flask和FastAPI项目,建议采用模块化的项目结构,将路由、模型、服务等分离到不同的文件中,保持代码的清晰和可维护性。Streamlit应用通常是单个Python脚本,但对于复杂的应用,也可以考虑将逻辑拆分为多个函数或模块。依赖管理:始终使用pipenv或poetry等工具管理项目依赖,确保环境的隔离和可复现性。错误处理和日志:在所有框架中,都应该实现健壮的错误处理机制,并使用日志记录来跟踪应用的行为和问题。安全性:对于Web应用和API,安全性至关重要。始终注意输入验证、身份验证、授权、CORS等安全问题。测试:为你的应用编写单元测试和集成测试,确保代码的质量和功能的正确性。部署:根据框架和应用类型选择合适的部署方式。Flask和FastAPI应用通常部署在Gunicorn、Uvicorn等ASGI/WSGI服务器上,并通过Nginx或Apache进行反向代理。Streamlit应用可以直接通过streamlit run运行,也可以部署到Streamlit Cloud或其他云平台。
-
基本使用方法1. 安装1pip install pywebview2. 简单示例(Python与HTML交互)12345678910111213141516171819202122import webviewdef print_message(message): print(f"收到前端消息: {message}")# 创建一个HTML字符串作为界面html = """<!DOCTYPE html><html><head> <title>PyWebView示例</title></head><body> <button onclick="python.print_message('你好,Python!')">发送消息到Python</button> <script> // 调用Python函数 window.python = pywebview.api; </script></body></html>"""# 创建窗口并加载HTMLwindow = webview.create_window("PyWebView应用", html=html)webview.start(gui=None, debug=True) # gui=None自动选择系统默认浏览器引擎结合Flask与waitress开发应用架构设计Flask:提供Web API,处理业务逻辑。pywebview:作为桌面应用的外壳,加载Flask的Web界面。waitress:在生产环境中替代Flask内置服务器,提供更好的性能。开发环境代码示例12345678910111213141516171819202122232425262728293031# app.py - Flask后端from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')def index(): return """ <!DOCTYPE html> <html> <head> <title>Flask + PyWebView应用</title> </head> <body> <h1>Hello from Flask!</h1> <button onclick="fetchData()">获取数据</button> <div id="result"></div> <script> async function fetchData() { const response = await fetch('/api/data'); const data = await response.json(); document.getElementById('result').textContent = data.message; } </script> </body> </html> """@app.route('/api/data')def get_data(): return jsonify({"message": "这是来自Flask后端的数据!"})if __name__ == '__main__': # 开发环境:使用Flask内置服务器 app.run(debug=True, port=5000)1234567891011121314# desktop.py - PyWebView桌面应用包装import webviewimport threadingimport subprocessdef run_flask(): # 启动Flask应用(开发环境) subprocess.run(['python', 'app.py'])if __name__ == '__main__': # 在后台线程中启动Flask flask_thread = threading.Thread(target=run_flask, daemon=True) flask_thread.start() # 创建PyWebView窗口,加载Flask应用 window = webview.create_window("桌面应用", "http://localhost:5000") webview.start(gui=None, debug=True)生产环境配置(使用waitress)1. 修改Flask应用(app.py)123456789101112# app.py - Flask后端(生产环境)from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')def index(): return """ <!-- 同上,HTML内容 --> """@app.route('/api/data')def get_data(): return jsonify({"message": "这是来自Flask后端的数据!"})# 移除开发环境的app.run(),改为导出app实例2. 使用waitress启动Flask12345# server.py - 使用waitress启动Flask(生产环境)from waitress import servefrom app import appif __name__ == '__main__': serve(app, host='127.0.0.1', port=5000, threads=8) # 生产环境使用waitress3. 修改PyWebView应用(desktop.py)1234567891011121314# desktop.py - PyWebView桌面应用(生产环境)import webviewimport threadingimport subprocessdef run_flask(): # 启动Flask应用(生产环境使用waitress) subprocess.run(['python', 'server.py'])if __name__ == '__main__': # 在后台线程中启动Flask flask_thread = threading.Thread(target=run_flask, daemon=True) flask_thread.start() # 创建PyWebView窗口,加载Flask应用 window = webview.create_window("桌面应用", "http://localhost:5000") webview.start(gui=None, debug=False) # 生产环境关闭调试模式打包应用的建议为了将应用分发给最终用户,可以使用PyInstaller或cx_Freeze将Python代码打包成单个可执行文件:12# 使用PyInstaller打包pyinstaller --onefile --windowed desktop.py注意事项:打包时需确保包含所有依赖项(如Flask、waitress、pywebview)。在macOS/Linux上可能需要额外配置以确保WebView组件正确加载。总结通过结合pywebview、Flask和waitress,可以开发出兼具美观界面和强大功能的跨平台桌面应用:开发阶段:使用Flask内置服务器和调试模式,提高开发效率。生产阶段:使用waitress替代Flask服务器,提升性能和稳定性。部署阶段:使用PyInstaller打包为独立可执行文件,方便分发。完整代码以下是在Windows平台上结合PyWebView、Flask和Waitress的完整代码实现。代码分为三个主要文件,分别负责Flask后端、桌面应用包装和生产环境启动。1. Flask后端代码(app.py)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475# app.py - Flask后端应用from flask import Flask, jsonify, render_template_stringimport osapp = Flask(__name__)# 确保中文正常显示app.config['JSON_AS_ASCII'] = False# 首页路由@app.route('/')def index(): return render_template_string(""" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>PyWebView + Flask应用</title> <style> body { font-family: 'Microsoft YaHei', sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } .container { background-color: #f9f9f9; border-radius: 8px; padding: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } h1 { color: #333; } button { background-color: #4CAF50; color: white; border: none; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 4px; } #result { margin-top: 20px; padding: 10px; background-color: #e8f5e9; border-radius: 4px; } </style> </head> <body> <div class="container"> <h1>PyWebView + Flask桌面应用</h1> <p>这是一个基于Web技术的跨平台桌面应用示例。</p> <button onclick="fetchData()">获取数据</button> <button onclick="callPythonFunction()">调用Python函数</button> <div id="result">点击按钮查看结果...</div> <script> // 从Python后端获取数据 async function fetchData() { try { const response = await fetch('/api/data'); if (!response.ok) throw new Error('网络响应失败'); const data = await response.json(); document.getElementById('result').textContent = data.message; } catch (error) { document.getElementById('result').textContent = '错误: ' + error.message; } } // 调用Python函数(通过PyWebView的API) async function callPythonFunction() { try { // 确保PyWebView API已加载 if (window.pywebview && window.pywebview.api) { const result = await window.pywebview.api.multiply_numbers(5, 3); document.getElementById('result').textContent = `Python计算结果: 5 × 3 = ${result}`; } else { document.getElementById('result').textContent = 'PyWebView API未加载'; } } catch (error) { document.getElementById('result').textContent = '调用Python函数时出错: ' + error.message; } } </script> </div> </body> </html> """)# API路由 - 返回JSON数据@app.route('/api/data')def get_data(): return jsonify({ "message": "这是来自Flask后端的数据!", "timestamp": str(os.times()), "platform": "Windows桌面应用" })# 导出Flask应用实例供其他模块使用if __name__ == '__main__': # 仅在直接运行此文件时使用Flask内置服务器(开发环境) app.run(debug=True, port=5000)2. 开发环境启动脚本(desktop_dev.py)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253# desktop_dev.py - 开发环境下的桌面应用启动脚本import webviewimport threadingimport subprocessimport timeimport sysfrom flask import Flaskdef run_flask(): """在子进程中启动Flask开发服务器""" # 确定Python可执行文件路径 python_exe = sys.executable # 启动Flask应用 server = subprocess.Popen( [python_exe, 'app.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True ) # 等待服务器启动 for line in server.stdout: print(line.strip()) if 'Running on' in line: break return serverclass Api: """供前端JavaScript调用的Python API""" def multiply_numbers(self, a, b): """示例函数:计算两个数的乘积""" return a * bif __name__ == '__main__': # 启动Flask服务器 flask_server = run_flask() try: # 创建API实例 api = Api() # 创建PyWebView窗口 window = webview.create_window( title="PyWebView桌面应用", url="http://localhost:5000", width=800, height=600, resizable=True, fullscreen=False, js_api=api # 暴露Python API给JavaScript ) # 启动PyWebView主循环 webview.start(debug=True) finally: # 关闭Flask服务器 if flask_server: flask_server.terminate() flask_server.wait() print("Flask服务器已关闭")3. 生产环境启动脚本(desktop_prod.py)12345678910111213141516171819202122232425262728293031323334353637383940414243# desktop_prod.py - 生产环境下的桌面应用启动脚本import webviewimport threadingimport subprocessimport timeimport sysfrom waitress import servefrom app import appclass Api: """供前端JavaScript调用的Python API""" def multiply_numbers(self, a, b): """示例函数:计算两个数的乘积""" return a * bdef run_waitress(): """使用waitress启动Flask应用(生产环境)""" print("正在启动Waitress服务器...") serve(app, host='127.0.0.1', port=5000, threads=8)if __name__ == '__main__': # 在后台线程中启动waitress服务器 server_thread = threading.Thread(target=run_waitress, daemon=True) server_thread.start() # 等待服务器启动(给服务器一些时间初始化) print("等待服务器启动...") time.sleep(2) try: # 创建API实例 api = Api() # 创建PyWebView窗口 window = webview.create_window( title="PyWebView桌面应用", url="http://localhost:5000", width=800, height=600, resizable=True, fullscreen=False, js_api=api # 暴露Python API给JavaScript ) # 启动PyWebView主循环(关闭调试模式) webview.start(debug=False) except Exception as e: print(f"应用启动失败: {e}") finally: print("应用已关闭")4. 运行说明开发环境安装依赖:1pip install flask pywebview waitress运行开发环境脚本:1python desktop_dev.py会自动启动Flask开发服务器和PyWebView窗口。修改代码后刷新页面即可看到变化。生产环境打包应用(可选):1pyinstaller --onefile --windowed desktop_prod.py直接运行生产环境脚本:1python desktop_prod.py使用waitress服务器替代Flask内置服务器,性能更好。关闭了调试模式,更安全稳定。功能说明前后端交互:前端通过fetch调用Flask API(如/api/data)。前端通过window.pywebview.api调用Python函数(如multiply_numbers)。界面特点:使用Tailwind CSS风格的界面(内联样式确保打包时不丢失)。支持中文显示(使用Microsoft YaHei字体)。响应式设计,适配不同屏幕尺寸。这个实现可以作为Windows桌面应用的基础框架,你可以根据需要扩展Flask API或修改前端界面。另一个应用示例代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748# create Desktop App by pywebview"""Replace the flask module with waitress module.To avoid the warning: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead."""import webviewfrom flask import Flask, render_template_stringimport threadingfrom waitress import serve# Create a Flask applicationapp = Flask(__name__)# Define the route@app.route('/')def index(): return render_template_string(""" <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Pywebview + Flask 示例</title> </head> <body> <h1>欢迎使用 Pywebview 和 Flask 构建的桌面应用!</h1> <a href="http://cnliutz.ipyingshe.net" rel="external nofollow" >Blog Site</a> </body> </html> """)def create_webview(): # Define the URL of the Flask application to load url = "http://127.0.0.1:5000" # Create a window and load the specified URL window = webview.create_window('Pywebview + Flask 应用', url) # Run the application webview.start()if __name__ == '__main__': # Start the Waitress server in a separate thread def run_waitress(): try: # Start Waitress to run the Flask application serve(app, host='127.0.0.1', port=5000) except Exception as e: print(f"Error starting Waitress: {e}") waitress_thread = threading.Thread(target=run_waitress) waitress_thread.daemon = True waitress_thread.start() # Start pywebview create_webview()
-
技术方案工具选择PyPDF2:轻量级PDF处理库,适合基本PDF操作os:处理文件和目录路径argparse:解析命令行参数安装依赖1pip install PyPDF2完整代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123import osimport argparsefrom PyPDF2 import PdfReader, PdfWriter def split_pdf(input_path, output_folder, ranges): """ 将PDF文件按指定页数范围分割 参数: input_path (str): 输入PDF文件路径 output_folder (str): 输出文件夹路径 ranges (list): 分割范围列表,格式为[(起始页, 结束页), ...] """ # 确保输出文件夹存在 if not os.path.exists(output_folder): os.makedirs(output_folder) # 获取文件名(不含扩展名) file_name = os.path.splitext(os.path.basename(input_path))[0] try: with open(input_path, 'rb') as file: reader = PdfReader(file) total_pages = len(reader.pages) print(f"开始处理: {input_path}") print(f"总页数: {total_pages}") # 处理每个分割范围 for i, (start, end) in enumerate(ranges): # 处理结束页为-1(表示到文档末尾)的情况 if end == -1: end = total_pages # 验证页码范围 if start < 1 or end > total_pages or start > end: print(f"⚠️ 警告: 无效的页码范围 [{start}, {end}],跳过") continue # 创建PDF写入对象 writer = PdfWriter() # 添加指定范围的页面(PyPDF2使用0-based索引) for page_num in range(start - 1, end): writer.add_page(reader.pages[page_num]) # 生成输出文件名 part_name = f"{file_name}_part{i+1}_p{start}-{end}.pdf" output_path = os.path.join(output_folder, part_name) # 写入文件 with open(output_path, 'wb') as output_file: writer.write(output_file) print(f"✅ 已创建: {part_name} (页数: {start}-{end})") print(f"分割完成! 文件保存在: {output_folder}") except Exception as e: print(f"❌ 处理过程中发生错误: {str(e)}") def parse_ranges(range_str): """ 解析页数范围字符串 参数: range_str (str): 页数范围字符串,格式如 "1,2-9,10-" 返回: list: 解析后的页数范围列表 """ ranges = [] parts = range_str.split(',') for part in parts: if '-' in part: start_end = part.split('-') start = int(start_end[0].strip()) # 处理结束页为空的特殊情况(表示到文档末尾) if start_end[1].strip() == '': end = -1 # 使用-1表示到文档末尾 else: end = int(start_end[1].strip()) else: # 单个页码 start = int(part.strip()) end = start ranges.append((start, end)) return ranges if __name__ == "__main__": # 设置命令行参数解析 parser = argparse.ArgumentParser( description="PDF文件分割工具 - 按指定页数范围分割PDF文档", formatter_class=argparse.RawTextHelpFormatter ) parser.add_argument('input', help='输入PDF文件路径') parser.add_argument('ranges', help='页数范围,格式如 "1,2-9,10-"\n' '示例: "1" - 仅第一页\n' ' "1-5" - 1到5页\n' ' "10-" - 从第10页到文档末尾\n' ' "1,3-5,7-" - 多个范围') parser.add_argument('-o', '--output', default='pdf_split_output', help='输出文件夹 (默认: pdf_split_output)') args = parser.parse_args() # 解析页数范围 try: ranges = parse_ranges(args.ranges) print(f"解析的分割范围: {ranges}") # 执行PDF分割 split_pdf(args.input, args.output, ranges) except ValueError: print("❌ 错误: 页数范围格式无效。请使用格式如 '1,2-9,10-'") except Exception as e: print(f"❌ 发生错误: {str(e)}")使用说明基本用法1python pdf_splitter.py 输入文件.pdf "页数范围" [-o 输出文件夹]示例命令分割为三个部分(第1页、第2-9页、第10页到最后):1python pdf_splitter.py "吉林省镇赉县*.pdf" "1,2-9,10-" -o 分割结果仅提取特定页面:12345678# 提取第5页python pdf_splitter.py input.pdf "5" # 提取第10-15页python pdf_splitter.py input.pdf "10-15" # 提取从第20页到文档末尾python pdf_splitter.py input.pdf "20-"提取多个不连续范围:12# 提取封面(1)、目录(3-4)和正文(6-)python pdf_splitter.py book.pdf "1,3-4,6-"输出示例解析的分割范围: [(1, 1), (2, 9), (10, -1)]开始处理: 吉林省镇赉县*.pdf总页数: 75✅ 已创建: 吉林省镇赉县*_part1_p1-1.pdf (页数: 1-1)✅ 已创建: 吉林省镇赉县*_part2_p2-9.pdf (页数: 2-9)✅ 已创建: 吉林省镇赉县*_part3_p10-75.pdf (页数: 10-75)分割完成! 文件保存在: 分割结果技术亮点1.灵活的页数范围解析支持单页、连续页和到文档末尾的表示法支持多个不连续范围的组合智能处理页码边界情况2.健壮的错误处理无效页码检测文件不存在处理格式错误提示3.用户友好的输出清晰的处理进度显示有意义的文件名生成详细的操作结果反馈4.命令行友好详细的帮助信息直观的参数设计默认值简化操作实际应用场景1.文档预处理分离封面、目录和正文提取合同中的关键条款分割大型报告为多个章节2.工作流程优化仅分发相关人员需要的部分创建演示材料的子集提取扫描文档中的特定页面3.自动化处理与OCR工具集成批量处理多个文档定时任务自动分割新文档扩展建议添加GUI界面:使用PyQt或Tkinter创建图形界面集成OCR功能:结合pytesseract提取文本内容添加水印功能:在分割后的文件添加特定水印支持批量处理:处理整个文件夹的PDF文件添加PDF压缩:减小输出文件大小
-
、pymysql的基本定位pymysql 是一个纯Python实现的 MySQL 数据库连接驱动,用于在 Python 程序中操作 MySQL 数据库。核心功能:提供连接数据库、执行 SQL 语句、处理查询结果等接口,类似于 Python 2 时代的 MySQLdb 模块。版本兼容性Python 3 专属:pymysql 设计用于 Python 3.x 环境,解决了 MySQLdb 在 Python 3 中不兼容的问题(MySQLdb 仅支持 Python 2)。兼容原理:pymysql 在接口层面模拟了 MySQLdb 的 API,便于开发者从 Python 2 迁移到 Python 3 时无缝过渡。pymysql的典型用法import pymysql # 连接数据库 conn = pymysql.connect( host='localhost', user='root', password='123456', database='test_db', port=3306 ) # 执行查询 with conn.cursor() as cursor: sql = "SELECT * FROM users WHERE id = %s" cursor.execute(sql, (1,)) result = cursor.fetchone() print(result) # 关闭连接 conn.close() 总结pymysql 的核心定位是 Python 3 环境下操作 MySQL 数据库的标准模块,其设计目标是兼容 Python 3 并替代 Python 2 中的 MySQLdb。在实际开发中,它是 Python 与 MySQL 交互的首选工具之一。
-
简介uuid 模块是Python标准库中用于生成通用唯一标识符(Universally Unique Identifier,UUID)的模块。UUID是一个128位的标识符,可以保证在全球范围内的唯一性。这个模块在分布式系统、数据库主键、会话标识、文件命名等场景中非常有用。核心功能1. UUID版本uuid1(): 基于时间戳和MAC地址uuid3(): 基于命名空间和名称的MD5哈希uuid4(): 基于随机数uuid5(): 基于命名空间和名称的SHA-1哈希2. UUID属性hex: 32个字符的十六进制字符串int: 128位整数bytes: 16字节的字节串urn: URN格式的字符串version: UUID版本号variant: UUID变体3. 命名空间NAMESPACE_DNS: DNS命名空间NAMESPACE_URL: URL命名空间NAMESPACE_OID: ISO OID命名空间NAMESPACE_X500: X.500 DN命名空间使用场景1. 生成唯一标识符import uuiddef generate_identifiers(): # 基于时间戳的UUID time_based_uuid = uuid.uuid1() print(f"基于时间的UUID: {time_based_uuid}") # 随机UUID random_uuid = uuid.uuid4() print(f"随机UUID: {random_uuid}") # 基于名称的UUID name_based_uuid = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') print(f"基于名称的UUID: {name_based_uuid}")2. 数据库主键import uuidfrom datetime import datetimeclass User: def __init__(self, username, email): self.id = uuid.uuid4() self.username = username self.email = email self.created_at = datetime.now() def __str__(self): return f"User(id={self.id}, username={self.username})"def create_user(): user = User("张三", "zhangsan@example.com") print(f"创建用户: {user}") return user3. 文件命名import uuidimport osdef save_file_with_uuid(content, extension='.txt'): # 生成唯一文件名 filename = f"{uuid.uuid4()}{extension}" # 保存文件 with open(filename, 'w') as f: f.write(content) print(f"文件已保存: {filename}")4. 会话管理import uuidfrom datetime import datetime, timedeltaclass SessionManager: def __init__(self): self.sessions = {} def create_session(self, user_id): session_id = uuid.uuid4() self.sessions[session_id] = { 'user_id': user_id, 'created_at': datetime.now(), 'expires_at': datetime.now() + timedelta(hours=24) } return session_id def validate_session(self, session_id): if session_id in self.sessions: session = self.sessions[session_id] if datetime.now() < session['expires_at']: return True return False使用注意事项UUID版本选择uuid1: 需要MAC地址,可能泄露隐私uuid3/5: 相同输入产生相同输出uuid4: 完全随机,最常用性能考虑uuid1 性能最好uuid4 随机性最好uuid3/5 适合需要确定性存储优化使用二进制存储考虑使用整数存储注意索引效率安全性避免使用 uuid1 泄露MAC地址注意UUID碰撞概率考虑使用加密UUID性能优化建议生成优化批量生成UUID缓存常用UUID使用合适的版本存储优化使用二进制格式压缩存储空间优化索引结构比较优化使用整数比较避免字符串比较缓存比较结果错误处理最佳实践UUID生成错误处理import uuiddef safe_generate_uuid(): try: return uuid.uuid4() except Exception as e: print(f"UUID生成失败: {e}") # 使用备用方案 return uuid.uuid1()UUID验证处理import uuiddef validate_uuid(uuid_str): try: # 尝试解析UUID uuid_obj = uuid.UUID(uuid_str) # 验证版本 if uuid_obj.version != 4: print(f"警告: 使用了非随机UUID版本 {uuid_obj.version}") return uuid_obj except ValueError as e: print(f"无效的UUID格式: {e}")实际应用案例1. 分布式ID生成器import uuidimport timeclass DistributedIdGenerator: def __init__(self, node_id): self.node_id = node_id self.sequence = 0 def generate_id(self): # 时间戳(41位) timestamp = int(time.time() * 1000) # 节点ID(10位) node = self.node_id & 0x3FF # 序列号(12位) self.sequence = (self.sequence + 1) & 0xFFF # 组合ID unique_id = (timestamp << 22) | (node << 12) | self.sequence return unique_id2. 文件版本控制import uuidimport osfrom datetime import datetimeclass FileVersionControl: def __init__(self, base_dir): self.base_dir = base_dir os.makedirs(base_dir, exist_ok=True) def save_version(self, file_content): # 生成版本ID version_id = uuid.uuid4() timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') # 保存文件 filename = f"v{timestamp}_{version_id}.txt" filepath = os.path.join(self.base_dir, filename) with open(filepath, 'w') as f: f.write(file_content) return version_id总结uuid 模块是Python中生成唯一标识符的强大工具。通过合理使用 uuid 模块,我们可以:生成全局唯一标识符实现分布式ID生成管理会话和缓存处理文件命名优化数据库设计———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/Aerkui/article/details/147775487
-
概述在 Windows 上使用 Waitress 部署 Flask 应用是一个不错的选择,因为 Waitress 是一个纯 Python 编写的 WSGI 服务器,它兼容 Windows 系统。以下是具体步骤来帮助你在 Windows 上通过 Waitress 部署 Flask 应用。windows 部署准备工作确保你已经安装了 Python:Waitress 需要 Python 环境,请确保你的系统上已经安装了 Python,并且版本适合你的项目需求。创建虚拟环境(可选但推荐):为了管理项目的依赖关系,建议为你的 Flask 项目创建一个虚拟环境。python -m venv venv激活虚拟环境: .\venv\Scripts\activate安装 Flask 和 Waitress:如果你还没有安装 Flask 和 Waitress,可以通过 pip 安装它们。pip install flask waitress使用 Waitress 部署 Flask 应用假设你已经有了一个简单的 Flask 应用,文件名为 app.py。接下来,我们将使用 Waitress 来运行这个应用。修改你的 Flask 应用:确保你的 Flask 应用可以被外部访问。通常情况下,你需要指定主机和端口。但是,Waitress 在 Windows 上运行时,你可以直接使用以下命令而不需要特别修改代码。使用 Waitress 运行 Flask 应用:打开命令提示符或 PowerShell,激活你的虚拟环境(如果使用的话),然后运行下面的命令来启动你的 Flask 应用。waitress-serve --port=8080 --call "app:create_app"这里有几个关键点需要注意:--port=8080:指定服务监听的端口号,可以根据需要进行调整。"app:create_app":这是告诉 Waitress 如何加载你的 Flask 应用。这里的 app 是包含 Flask 应用实例的 Python 文件名(不包括 .py 扩展名),而 create_app 是该文件中返回 Flask 应用实例的函数名称。如果你的 Flask 应用实例是直接定义的(如 app = Flask(__name__)),可以直接引用它,而无需使用 --call 参数。waitress-serve --port=8080 app:app如果你希望使用 --call 参数,可以通过工厂函数来创建 Flask 应用实例。修改 app.py 文件如下:# app.pyfrom flask import Flaskdef create_app(): app = Flask(__name__) @app.route('/') def home(): return "Hello, World!" return app然后运行以下命令:waitress-serve --port=8080 --call "app:create_app"这里 --call "app:create_app" 表示:app 是包含工厂函数的 Python 文件名。create_app 是返回 Flask 应用实例的函数。linux 部署2. 使用 WSGI 服务器Flask 内置的开发服务器不适合生产环境。推荐使用以下 WSGI 服务器:Gunicorn(适合 Linux/Unix 系统)Waitress(适合 Windows 系统)示例:使用 Gunicornpip install gunicorngunicorn -w 4 -b 0.0.0.0:8000 app:app-w 4:启动 4 个工作进程(根据 CPU 核心数调整)。-b 0.0.0.0:8000:绑定到所有网络接口的 8000 端口。app:app:第一个 app 是文件名(如 app.py),第二个 app 是 Flask 实例名称。nginx反向代理ubuntu 配置安装 Nginx:sudo apt updatesudo apt install nginx创建 Nginx 配置文件(例如 /etc/nginx/sites-available/flask_app):server { listen 80; server_name your_domain_or_ip; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}启用配置并重启 Nginx:sudo ln -s /etc/nginx/sites-available/flask_app /etc/nginx/sites-enabled/sudo nginx -t # 测试配置是否正确sudo systemctl restart nginx5. 使用进程管理工具为了确保 Flask 应用在后台持续运行并能够自动重启,可以使用进程管理工具,如:SupervisorSystemdPM2(适合 Node.js,但也可以用于 Python)示例:使用 Systemd创建服务文件(例如 /etc/systemd/system/flask_app.service):[Unit]Description=Gunicorn instance to serve Flask appAfter=network.target[Service]User=your_userGroup=www-dataWorkingDirectory=/path/to/your/appExecStart=/path/to/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app[Install]WantedBy=multi-user.target启动并启用服务:sudo systemctl start flask_appsudo systemctl enable flask_app———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/ling_zhi_xin/article/details/147324917
-
一、os 库概述功能:提供与操作系统交互的接口,包括文件管理、环境变量、进程控制、路径操作等。跨平台特性:大部分函数支持 Windows、Linux、macOS,但部分功能存在系统差异。核心模块:os:基础操作系统接口os.path:路径处理工具导入方式:import osAI写代码二、常用功能分类详解1. 路径操作(os.path 模块)函数 描述 示例 输出示例os.path.abspath(path) 返回绝对路径 os.path.abspath("test.txt") /home/user/test.txtos.path.dirname(path) 返回路径的目录部分 os.path.dirname("/a/b/c.txt") /a/bos.path.basename(path) 返回路径的文件名部分 os.path.basename("/a/b/c.txt") c.txtos.path.join(path1, path2) 智能拼接路径(跨平台安全) os.path.join("dir", "file.txt") dir/file.txtos.path.exists(path) 检查路径是否存在 os.path.exists("test.txt") True/Falseos.path.isfile(path) 检查是否为文件 os.path.isfile("test.txt") Trueos.path.isdir(path) 检查是否为目录 os.path.isdir("docs") Trueos.path.getsize(path) 获取文件大小(字节) os.path.getsize("test.txt") 1024os.path.splitext(path) 分割文件名和扩展名 os.path.splitext("file.txt") ('file', '.txt') 2. 目录管理函数 描述 示例 注意os.getcwd() 获取当前工作目录 print(os.getcwd()) 返回绝对路径os.chdir(path) 切换当前工作目录 os.chdir("..") 失败抛出 FileNotFoundErroros.listdir(path=".") 列出目录内容 os.listdir("/tmp") 返回文件名列表(不递归)os.mkdir(path) 创建单层目录 os.mkdir("new_dir") 目录已存在时抛出 FileExistsErroros.makedirs(path) 递归创建多层目录 os.makedirs("a/b/c") 类似 mkdir -pos.rmdir(path) 删除空目录 os.rmdir("empty_dir") 目录非空时抛出 OSErroros.removedirs(path) 递归删除空目录 os.removedirs("a/b/c") 从最深层开始向上删除 3. 文件操作函数 描述 示例 注意os.remove(path) 删除文件 os.remove("temp.txt") 文件不存在时抛出 FileNotFoundErroros.rename(src, dst) 重命名/移动文件或目录 os.rename("old.txt", "new.txt") 跨磁盘移动可能失败os.stat(path) 获取文件状态信息 st = os.stat("file.txt")st.st_size 返回包含大小、时间等的对象os.utime(path, times) 修改文件访问/修改时间 os.utime("file.txt", (atime, mtime)) 时间戳为秒数 4. 进程管理函数 描述 示例 注意os.system(command) 执行系统命令 os.system("ls -l") 返回命令退出状态码os.popen(command) 执行命令并获取输出(已废弃) output = os.popen("date").read() 建议改用 subprocessos.exec*() 系列 替换当前进程(如 os.execlp) os.execlp("python", "python", "script.py") 执行后原进程终止os.kill(pid, signal) 向进程发送信号 os.kill(pid, signal.SIGTERM) Windows 支持有限 5. 环境变量管理函数/属性 描述 示例 注意os.environ 字典形式的环境变量 os.environ["PATH"] 修改后仅影响当前进程os.getenv(key, default) 获取环境变量值 os.getenv("HOME", "/tmp") 键不存在时返回 defaultos.putenv(key, value) 设置环境变量(不推荐) os.putenv("DEBUG", "1") 建议直接操作 os.environ 6. 系统信息函数/属性 描述 示例 输出示例os.name 操作系统名称 print(os.name) posix(Linux/macOS)nt(Windows)os.sep 路径分隔符 os.sep / 或 \os.linesep 行终止符 os.linesep \n(Linux)\r\n(Windows)os.cpu_count() 返回 CPU 核心数 os.cpu_count() 8三、实际应用示例1. 递归遍历目录def list_files(startpath): for root, dirs, files in os.walk(startpath): level = root.replace(startpath, '').count(os.sep) indent = ' ' * 4 * level print(f"{indent}{os.path.basename(root)}/") subindent = ' ' * 4 * (level + 1) for f in files: print(f"{subindent}{f}") list_files("/tmp")AI写代码 os.walk(path) 是 Python 中用于递归遍历目录结构的核心函数,可深度遍历指定路径下的所有子目录和文件。以下从功能、参数、返回值到应用场景的全面解析:①、核心功能与运行机制目录树遍历以 path 为根目录,逐层遍历所有子目录,生成目录树的完整结构。支持 深度优先 或 广度优先 遍历(通过 topdown 参数控制)。数据生成方式返回一个 生成器(generator),按需生成三元组 (root, dirs, files),避免一次性加载所有路径导致内存压力。②、参数详解pythonos.walk(top, topdown=True, onerror=None, followlinks=False)AI写代码参数 类型 作用top str 要遍历的根目录路径topdown bool 默认 True:先返回父目录再子目录;False 则逆序(从叶子节点向上)onerror callable 遍历出错时的回调函数(接收异常对象作为参数)followlinks bool 是否追踪符号链接指向的真实目录(默认 False)③、返回值解析每次迭代返回的三元组包含:**root**当前遍历的目录绝对路径(如 "/data/images/cats")。**dirs**当前目录下的 直接子目录名列表(不含路径,如 ["2023", "2024"])。**files**当前目录下的 文件名列表(不含路径,如 ["cat1.jpg", "cat2.png"])。示例目录结构:markdownroot/├── dir1/│ ├── file1.txt│ └── subdir/└── dir2/ └── file2.logAI写代码对应的遍历输出:python# 第一次迭代('root', ['dir1', 'dir2'], []) # 第二次迭代(进入 dir1)('root/dir1', ['subdir'], ['file1.txt']) # 第三次迭代(进入 subdir)('root/dir1/subdir', [], []) # 第四次迭代(进入 dir2)('root/dir2', [], ['file2.log'])AI写代码 遍历所有文件并获取完整路径pythonimport os for root, dirs, files in os.walk("data"): for file in files: full_path = os.path.join(root, file) # 拼接完整路径[3,6](@ref) print(f"发现文件:{full_path}")AI写代码 2. 批量重命名文件folder = "docs"for filename in os.listdir(folder): if filename.endswith(".txt"): new_name = filename.replace(" ", "_") os.rename( os.path.join(folder, filename), os.path.join(folder, new_name) )AI写代码 3. 安全创建临时目录import tempfile def create_temp_dir(): temp_dir = tempfile.mkdtemp() try: print(f"临时目录已创建: {temp_dir}") # 执行操作... finally: os.rmdir(temp_dir) print("临时目录已删除")AI写代码四、注意事项1. 路径处理不要手动拼接路径:使用 os.path.join() 替代字符串拼接,避免跨平台问题:# 错误方式path = "dir" + "/" + "file.txt" # 在Windows下失效 # 正确方式path = os.path.join("dir", "file.txt")AI写代码2. 异常处理文件操作需捕获常见异常:try: os.remove("non_exist.txt")except FileNotFoundError as e: print(f"文件不存在: {e}")AI写代码3. 安全性谨慎使用 os.system():可能引发命令注入漏洞,优先使用 subprocess.run():# 危险!用户输入可能包含恶意命令user_input = "some; rm -rf /"os.system(f"echo {user_input}") # 安全方式import subprocesssubprocess.run(["echo", user_input], check=True)AI写代码4. 跨平台兼容性检查系统差异:if os.name == 'posix': print("运行在 Unix-like 系统")elif os.name == 'nt': print("运行在 Windows 系统")AI写代码五、与 shutil 库的对比功能 os 库 shutil 库文件复制 ❌ 无直接支持 ✅ shutil.copy()目录删除 ✅ 只能删空目录 ✅ shutil.rmtree() 递归删除压缩文件 ❌ 无支持 ✅ shutil.make_archive()元数据保留 ❌ 需手动处理 ✅ copystat() 保留权限和时间———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/wanglaqqqq/article/details/146064391
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签