需要资料,关注我回复111
为何选择Python进行开发?
不久前,我推出了我的首个产品——Siphon吸词,它旨在帮助英语学习者通过阅读来高效积累词汇量。这个产品有一个特色功能:用户在浏览网页时遇到生词,只需双击,即可将其记录到生词本中,并且系统会自动保存生词所在的句子,以便用户理解该词的用法。然而,许多用户反馈说,他们希望在复习时,这些句子能够提供翻译功能。
添加图片注释,不超过 140 字(可选)
为此,我进行了一番调研,并最终发现字节跳动的豆包大模型在翻译质量和速度上表现出色,价格也颇具竞争力。因此,我决定利用豆包大模型的API来实现句子的翻译功能。翻译效果如下:
翻译结果令人满意,英文原文中并未提及"Her"是一部电影,但大模型却能识别出"Her"指的是电影《她》。
不过,豆包大模型目前仅提供了Python的SDK,而我所熟悉的JavaScript和Go语言并未提供官方SDK。同时,我也想借此机会重新学习Python这门语言,因此决定基于Python来实现翻译API。
顺便说一句,多年前我曾系统学习过Python,并用Python编写过一些简单的自动化交易程序。所以,重新上手Python项目开发,配合Copilot的辅助,语言层面并无太大障碍,主要问题还是工程方面的挑战。
Python的Web开发生态极为丰富,可以用“乱花渐欲迷人眼”来形容。以下是一些知名的开源框架:
- FastAPI,GitHub星星数71.6k;
- Django,GitHub星星数77.1k;
- Flask,GitHub星星数66.6k;
- Tornado,GitHub星星数21.5k;
- Falcon,GitHub星星数9.4k。
可选方案众多。由于我的需求仅是提供API供前端调用,简单浏览了一些热门框架的README文档,并咨询了ChatGPT后,我迅速决定使用FastAPI作为项目的API框架。FastAPI的使用非常简单,以下是一个示例:
```pythonfrom fastapi import FastAPIapp = FastAPI()@app.get("/")def read_root(): return {"Hello": "World"}```
作为初学者,我虽然听说过Python的虚拟环境,但一开始并未给予太多关注,直到遇到问题。
按照豆包文档的指导,我用pip安装了豆包的SDK,但在编辑器环境和脚本运行时总是报错,无法找到相应的包。经过一番调查,发现问题可能是由于我本地安装了多个版本的Python解释器,它们的安装目录不同。pip安装的全局包位于目录A,而编辑器和代码执行时使用的是另一个解释器,它会在目录B的全局目录中寻找包。于是,“虚拟环境”便应运而生。
以下是ChatGPT的解释:
在Python开发中,“虚拟环境”(virtual environment)是一个独立的、隔离的Python环境。它包含特定版本的Python解释器及安装在其中的包和库,且与全局的Python环境相互独立。使用虚拟环境可以为不同的项目创建隔离的开发空间,避免包和依赖冲突,确保项目的一致性和可移植性。
虽然这个解释并不完全准确,但可以将其类比为前端开发中的“本地安装”。在前端开发中,npm install默认会将包安装在本地目录中。而Python需要先创建“虚拟环境”,这样后续pip安装的包会安装在虚拟环境中,与全局环境隔离。
Python中创建虚拟环境的方法有很多,例如:
- venv
- virtualenv
- pipenv
- conda
- poetry
具体如何使用这些工具,可以查看相关文档,或咨询ChatGPT。在阅读了一些文章后,我选择了poetry,原因如下:
- Poetry使用标准的pyproject.toml文件来定义项目依赖和元数据。
- Poetry支持从项目的元数据直接发布到PyPI或其他包仓库。
- Poetry的依赖解析和安装性能通常比Pipenv更快。
- 近年来,Poetry得到了更多的关注和采用。
虽然我目前还没有明显感受到poetry的优势,但既然许多人推荐使用这个更现代化的工具,我最终选择了它。
以下是一些poetry的常用命令:
```csharp// 初始化项目poetry init// 激活虚拟环境poetry shell// 添加依赖poetry add package_name```
与JavaScript类似,Python项目的Dockerfile大致流程如下:
- 首先需要基础镜像。
- 然后复制包管理的lock文件等,安装依赖。
- 接着复制必要的项目文件。
- 最后通过uvicorn启动服务。
实际上,这个过程非常简单,甚至可以让ChatGPT帮你写一个Dockerfile。我遇到的问题是,构建出的镜像大小居然达到了1.2G(我喜欢的Web开发语言Go,镜像通常只有几十M)。
我最后参考了Medium上的一篇文章:"How to make your Python Docker images secure, fast & small",对镜像尺寸进行了优化,最终降至600多M。如果你对此感兴趣,推荐阅读这篇文章。顺便做个小广告,如果你觉得自己的英文阅读能力需要提高,不妨试试我开发的产品Siphon吸词,我亲自使用了两个多月,词汇量和阅读能力都有了明显提升。
最后的Dockerfile大致如下:
```bashFROM python:3.11-slim as buildENV PIP_DEFAULT_TIMEOUT=100 \ PYTHONUNBUFFERED=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 \ PIP_NO_CACHE_DIR=1 \ POETRY_VERSION=1.3.2WORKDIR /appCOPY pyproject.toml poetry.lock ./RUN pip install "poetry==$POETRY_VERSION" \ && poetry install --no-root --no-ansi --no-interaction \ && poetry export -f requirements.txt -o requirements.txt# Final stageFROM python:3.11-slim as finalWORKDIR /appCOPY --from=build /app/requirements.txt .RUN set -ex \ && addgroup --system --gid 1001 appgroup \ && adduser --system --uid 1001 --gid 1001 --no-create-home appuser \ && apt-get update \ && apt-get upgrade -y \ && pip install -r requirements.txt \ && apt-get autoremove -y \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/*COPY ./artifacts artifactsCOPY ./api apiEXPOSE 8000CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000"]# Set the user to run the applicationUSER appuser```
选择Python进行开发,是因为它的灵活性、丰富的库和框架以及强大的社区支持。通过使用FastAPI、虚拟环境、poetry和Docker,我能够高效地构建、部署和优化我的Python项目。这些工具和实践不仅提高了开发效率,还确保了项目的可维护性和可扩展性。