图片由作者提供
这似乎是一个相当棘手的话题,但不管你信不信,构建 AI 应用程序的 90% 问题的主要原因都是 Python 依赖关系。
你测试了一个昨天还在运行的 AI 应用,然后突然:突然一切都崩溃了!你开始寻找原因,调试代码……这不是你的问题,是你的 Python 库更新导致崩溃!
我找到了一种避免安装 5 个不同 Python 版本并一劳永逸解决问题的方法。
而且,您还可以拥有一条便携式 Python,里面装有您所需的一切,随时可以随您去任何地方!
了解 Python Embedded
嵌入式发行版是一个包含最小 Python 环境的 ZIP 文件。它旨在作为另一个应用程序的一部分,而不是由最终用户直接访问。
图片来自https://www.python.org/downloads/windows/
这个相当简单的 ZIP 文件包含一个可移植的 python,它有相当多的限制:您无法安装依赖项,因为您没有 pip。
但是假设我们可以使用 pip… 您仍然无法从源代码构建包:如果您获得已编译的 wheel 包,则不会遇到任何问题,但如果安装需要构建它… 您就不能。
但我们对此也有一个解决方案。
实际情况
到目前为止,如果您关注我的一些文章,您会注意到我几乎总是使用 Python 3.10。这并不是因为我已经习惯了它……只是直到几周前,每次我尝试使用更高的 Python 版本时,句子片段库都会崩溃。
同时,我被迫使用 1.27.0 之前的 Streamlit,因为在构建 Web 服务器时 Protobuf 正在抑制任何 API 调用。
那么该怎么办呢?在 Windows 机器上安装多个 Python 版本可能有点棘手,比在 Linux/Mac OS 上要棘手得多。您需要将它们添加到 PATH,这会开始弄乱您的命令。
解决方案至少有两个。
1. 单独使用Python嵌入
如果你知道不需要编译任何包,那么这个选项是最安全的。你解压官方的 ZIP 文件,做一些小改动,然后就大功告成了。
示例:构建Streamlit
连接到OpenAI
兼容 API 的应用程序。
在这种情况下,我们希望使用最新Streamlit
版本(1.34.0),它具有完整的聊天界面支持、文本流和新样式管理。它需要Python 3.11+
创建一个全新的文件夹(我的文件夹叫做),然后从官方页面pythontests
下载Python 3.11.7 Embedded :我的系统是 64 位,minipc,所以我将下载 64 位的 ZIP 存档。
有 3 个可嵌入包 — 选择适合您的包
现在你可以将 ZIP 文件解压到名为python311
保持其井然有序,以便将来可以重复使用相同的整个文件夹。
如果您使用的是 Windows 终端(例如我在 Windows 11 中使用的终端),您也可以从终端窗口提取存档:
展开-存档-强制 .\python- 3.11 .7 -embed-amd64. zip .\python311
您可以立即开始使用全新的 Python 解释器!只需在pythontests
文件夹中打开一个终端并运行:
.\python311\ python.exe
准备就绪 — 退出 Ctrl+Break
此便携版本无法安装 pip 依赖项。尝试一下,你会看到一条烦人的消息:
没有名为 pip 的模块
在嵌入式 Python 中安装 pip 很容易。首先,你必须编辑python311._pth
新提取的目录中的文件python311
然后我们必须Lib/site-packages
在文本文件的顶部添加并取消注释您找到的最后一行import site
。
保存文件!
现在浏览 python311 文件夹并从终端运行下面的 curl 命令来安装 get-pip.py 文件,该文件是向我们的嵌入式 python 添加 pip 支持所必需的。
cd .\python311\ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
get-pip.py 现已位于你的嵌入式 Python 发行版中
最后,从同一个 python311 文件夹运行python.exe get-pip.py
现在安装 pip 包与平常一样。请记住一定要使用嵌入式 Python 文件夹中的 Python 可执行文件。
例如:
# 在主项目目录 pythontests .\python311\python.exe -m pip install streamlit==1.34.0 # 从 python311 目录 python.exe -m pip install openai
注意:这里运行得非常好……但我们仍然有一个问题:我们无法安装任何需要构建的包。例如,我非常喜欢llama-cpp-python
:最新版本 0.2.75 没有附带预构建的轮子。
更新 2024.05.21 — 现在我们也有轮子了
我为什么要用它?
如果您想要发送一个包含出色 Python 项目的单个存档,并希望将其传递给您的同事或朋友,您不能给他们venv
。在嵌入式 Python 目录中安装依赖项将保留具有相对路径的依赖项……无论您将主文件夹移动到哪里,都不会损坏任何东西。
2 使用嵌入式 Python 创建虚拟环境
从我的角度来看,第二种选择更可取,至少对于您的本地原型设计而言。您基本上使用嵌入式 Python 来创建具有您选择的 Python 版本的虚拟环境。
让我们看看我的设置:
- 在我的迷你电脑上安装了 Python 3.10
- 我刚才和你一起创建了一个Python311版本
如果我需要一个带有 Python 3.12 的虚拟环境怎么办?
简单!让我们从这里下载适用于 Python 3.12 的嵌入式 Python 。让我们使用同一pythontests
目录下载 ZIP 文件。您也可以从终端使用以下命令执行此操作
wget https://www.python.org/ftp/python/3.12.2/python-3.12.2-embed-amd64.zip -OutFile python-3.12.2-embed-amd64.zip
我们还可以从终端将 ZIP 文件提取到新文件夹中:
展开-存档-强制 .\python- 3.12 .2 -embed-amd64. zip .\python312
现在在我们的测试文件夹中,我们有一个python311
带有 pip 包和已经安装的几个其他包(streamlit
、、openai
和 llama-cpp-python
)以及一个尚不支持的全新便携式 Python pip
……
python312 文件夹已准备好
并且不支持虚拟环境!
相当没用
因此,第一步是确保python312
可以下载 pip 包。进入python312
目录并python312._pth
进行与之前相同的更改。
然后我们从终端窗口里面的python312目录下载著名的get-pip.py并运行该命令。
cd . \ python312 \ curl https://bootstrap.pypa.io/get-pip.py-o get-pip.py . \ python.exe . \ get-pip.py
安装virtualenv
到你的便携式 Python 中
我们需要一个用于嵌入式 Python 的 venv 工具。当你以传统方式安装 Python 时,它已经配备了该工具。
venv——创建虚拟环境
源代码:Lib/venv/venv 模块支持创建轻量级“虚拟环境”,每个虚拟环境都有自己的……
在我们的例子中,它不是。但我们可以轻松地做到这一点
.\python.exe -m pip 安装虚拟环境
virtualenv
使用便携式 Python创建一个
现在你需要注意这一步。要创建,venv
你python312
需要在你想要虚拟环境的主文件夹中。假设我想要主目录中的 venv pythontests
。
在终端中,我打开项目文件夹并运行;
.\python312\python.exe -m virtualenv venv
现在我有一个 python 3.12 虚拟环境
我们只需尝试激活它就可以发现它正在运行:
venv\脚本\activate
我的终端已经告诉我在 venv 中安装了哪个 python
要验证你的 Python 版本,请运行:
.\venv\Scripts\python .exe --版本 Python 3.12 . 2