<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>构建与打包 on 扎塔-Zata</title><link>https://www.zata.cc/categories/%E6%9E%84%E5%BB%BA%E4%B8%8E%E6%89%93%E5%8C%85/</link><description>Recent content in 构建与打包 on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Example Person</copyright><lastBuildDate>Thu, 24 Sep 2026 17:09:06 +0800</lastBuildDate><atom:link href="https://www.zata.cc/categories/%E6%9E%84%E5%BB%BA%E4%B8%8E%E6%89%93%E5%8C%85/index.xml" rel="self" type="application/rss+xml"/><item><title>npm使用教程</title><link>https://www.zata.cc/p/npm%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Wed, 16 Jul 2025 00:40:23 +0800</pubDate><guid>https://www.zata.cc/p/npm%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/npm%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post npm使用教程" />&lt;p>这是一份详细的 npm (Node Package Manager) 使用教程，从入门基础到高级技巧和最佳实践，希望能帮助你完全掌握这个强大的工具。&lt;/p>
&lt;hr>
&lt;h3 id="目录">目录
&lt;/h3>&lt;ul>
&lt;li>&lt;a class="link" href="#1-%e4%bb%80%e4%b9%88%e6%98%af-npm" >什么是 npm？&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#2-%e5%ae%89%e8%a3%85-npm" >安装 npm&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#3-%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5" >核心概念&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#4-%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%e8%af%a6%e8%a7%a3" >常用命令详解&lt;/a>
&lt;ul>
&lt;li>&lt;a class="link" href="#npm-init" >npm init&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-install" >npm install&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-uninstall" >npm uninstall&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-update" >npm update&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-run" >npm run&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-list" >npm list&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a class="link" href="#5-%e6%b7%b1%e5%85%a5%e7%90%86%e8%a7%a3-packagejson" >深入理解 package.json&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#6-%e7%89%88%e6%9c%ac%e7%ae%a1%e7%90%86%e8%af%ad%e4%b9%89%e5%8c%96%e7%89%88%e6%9c%ac-semver" >版本管理：语义化版本 (SemVer)&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#7-%e8%bf%9b%e9%98%b6%e5%91%bd%e4%bb%a4" >进阶命令&lt;/a>
&lt;ul>
&lt;li>&lt;a class="link" href="#npm-outdated" >npm outdated&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-ci" >npm ci&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-audit" >npm audit&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-view" >npm view&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npx" >npx&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a class="link" href="#8-%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5%e5%92%8c%e6%8a%80%e5%b7%a7" >最佳实践和技巧&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#npm-%e7%9b%b8%e5%85%b3%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e6%95%99%e7%a8%8b" >npm 相关问题解决教程&lt;/a>
&lt;ul>
&lt;li>&lt;a class="link" href="#1-%e5%89%8d%e7%ab%af%e5%90%af%e5%8a%a8%e9%97%ae%e9%a2%98" >前端启动问题&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#2-npm-%e8%84%9a%e6%9c%ac%e5%91%bd%e4%bb%a4%e8%af%a6%e8%a7%a3" >npm 脚本命令详解&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#3-%e5%b8%b8%e7%94%a8-npm-%e8%84%9a%e6%9c%ac%e9%85%8d%e7%bd%ae" >常用 npm 脚本配置&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#4-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" >常见问题排查&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#5-%e8%84%9a%e6%9c%ac%e6%9c%80%e4%bd%b3%e5%ae%9e%e8%b7%b5" >脚本最佳实践&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#6-%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3%e6%80%bb%e7%bb%93" >问题解决总结&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="常用命令">常用命令
&lt;/h3>&lt;p>以下是最常用的 npm 命令：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>命令&lt;/th>
&lt;th>别名&lt;/th>
&lt;th>说明&lt;/th>
&lt;th>示例&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>npm install&lt;/code>&lt;/td>
&lt;td>&lt;code>npm i&lt;/code>&lt;/td>
&lt;td>安装项目依赖&lt;/td>
&lt;td>&lt;code>npm install&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm install &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>npm i &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>安装特定包&lt;/td>
&lt;td>&lt;code>npm install lodash&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm install &amp;lt;package&amp;gt; --save-dev&lt;/code>&lt;/td>
&lt;td>&lt;code>npm i &amp;lt;package&amp;gt; -D&lt;/code>&lt;/td>
&lt;td>安装开发依赖&lt;/td>
&lt;td>&lt;code>npm install jest -D&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm uninstall &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>&lt;code>npm un &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>卸载包&lt;/td>
&lt;td>&lt;code>npm uninstall lodash&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm update&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>更新包&lt;/td>
&lt;td>&lt;code>npm update&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm init&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>初始化项目&lt;/td>
&lt;td>&lt;code>npm init&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm init -y&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>快速初始化&lt;/td>
&lt;td>&lt;code>npm init -y&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm start&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>启动应用&lt;/td>
&lt;td>&lt;code>npm start&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm test&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>运行测试&lt;/td>
&lt;td>&lt;code>npm test&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm run &amp;lt;script&amp;gt;&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>运行脚本&lt;/td>
&lt;td>&lt;code>npm run dev&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm list&lt;/code>&lt;/td>
&lt;td>&lt;code>npm ls&lt;/code>&lt;/td>
&lt;td>查看已安装的包&lt;/td>
&lt;td>&lt;code>npm list --depth=0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm outdated&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>检查过时的包&lt;/td>
&lt;td>&lt;code>npm outdated&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm audit&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>安全漏洞检查&lt;/td>
&lt;td>&lt;code>npm audit&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npm audit fix&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>修复安全漏洞&lt;/td>
&lt;td>&lt;code>npm audit fix&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>npx &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>-&lt;/td>
&lt;td>执行包而不安装&lt;/td>
&lt;td>&lt;code>npx create-react-app my-app&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="快速参考">快速参考
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 初始化项目&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm init -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install &lt;span class="o">[&lt;/span>--legacy-peer-deps&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装/卸载包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install &amp;lt;包名&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install &amp;lt;包名&amp;gt; --save-dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm uninstall &amp;lt;包名&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm &lt;span class="nb">test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看/更新/安全&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm list --depth&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm outdated
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm audit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm audit fix
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="1-什么是-npm">1. 什么是 npm？
&lt;/h3>&lt;p>npm (Node Package Manager) 是 Node.js 的默认包管理器。它主要有两个功能：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>命令行工具 (CLI)&lt;/strong>: 一个安装在你电脑上的命令行工具，用于安装、管理和发布 JavaScript 包。&lt;/li>
&lt;li>&lt;strong>在线仓库 (Registry)&lt;/strong>: 一个巨大的公共在线数据库，存放了成千上万个可重用的 JavaScript 代码包（也称为模块或依赖）。&lt;/li>
&lt;/ul>
&lt;p>简单来说，当你需要一个特定功能（比如处理日期、发送网络请求）时，你不需要从零开始写，可以直接从 npm 仓库下载别人已经写好的包，并在你的项目中使用。&lt;/p>
&lt;h3 id="2-安装-npm">2. 安装 npm
&lt;/h3>&lt;p>npm 是随 Node.js 一起安装的。所以，你只需要安装 Node.js，npm 就会自动安装好。&lt;/p>
&lt;ol>
&lt;li>访问 &lt;a class="link" href="https://nodejs.org/" target="_blank" rel="noopener"
>Node.js 官方网站&lt;/a>。&lt;/li>
&lt;li>下载推荐的 &lt;strong>LTS (Long Term Support)&lt;/strong> 版本并安装。&lt;/li>
&lt;li>安装完成后，打开你的终端（在 Windows 上是 Command Prompt 或 PowerShell，在 macOS/Linux 上是 Terminal），运行以下命令来验证安装：&lt;/li>
&lt;/ol>
&lt;!-- end list -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看 Node.js 版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">node -v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看 npm 版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果能看到版本号，说明安装成功。&lt;/p>
&lt;h3 id="3-核心概念">3. 核心概念
&lt;/h3>&lt;p>理解这三个文件/文件夹是掌握 npm 的关键。&lt;/p>
&lt;ul>
&lt;li>&lt;code>package.json&lt;/code>
&lt;ul>
&lt;li>&lt;strong>是什么&lt;/strong>：项目的&amp;quot;身份证&amp;quot;或&amp;quot;说明书&amp;quot;。它是一个 JSON 格式的配置文件，位于项目的根目录。&lt;/li>
&lt;li>&lt;strong>作用&lt;/strong>：定义了项目的名称、版本、作者等元数据，并且最重要的是，它记录了项目需要哪些依赖包（&lt;code>dependencies&lt;/code>）和开发过程中需要哪些依赖包（&lt;code>devDependencies&lt;/code>）。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>node_modules&lt;/code>
&lt;ul>
&lt;li>&lt;strong>是什么&lt;/strong>：存放所有项目依赖的文件夹。&lt;/li>
&lt;li>&lt;strong>作用&lt;/strong>：当你使用 &lt;code>npm install&lt;/code> 命令时，npm 会根据 &lt;code>package.json&lt;/code> 的记录，从 npm 仓库下载所有需要的包，并存放在这个文件夹里。&lt;strong>这个文件夹通常非常大，不应该提交到版本控制系统（如 Git）中&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;code>package-lock.json&lt;/code>
&lt;ul>
&lt;li>&lt;strong>是什么&lt;/strong>：锁定依赖版本的&amp;quot;快照&amp;quot;文件。&lt;/li>
&lt;li>&lt;strong>作用&lt;/strong>：它精确地记录了 &lt;code>node_modules&lt;/code> 文件夹中每个包的&lt;strong>确切版本&lt;/strong>及其依赖树。这确保了团队中每个成员以及在服务器上部署时，安装的依赖版本都是完全一致的，避免了&amp;quot;在我电脑上能跑&amp;quot;的问题。&lt;strong>这个文件应该提交到版本控制系统&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="4-常用命令详解">4. 常用命令详解
&lt;/h3>&lt;h4 id="npm-init">&lt;code>npm init&lt;/code>
&lt;/h4>&lt;p>用于初始化一个新的 Node.js 项目，它会引导你创建一个 &lt;code>package.json&lt;/code> 文件。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建一个新文件夹并进入&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir my-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> my-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行初始化命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>系统会问你一系列问题（项目名称、版本、描述等），你可以一路按回车使用默认值。&lt;/p>
&lt;p>如果你想快速生成一个默认的 &lt;code>package.json&lt;/code>，可以使用 &lt;code>-y&lt;/code> 标志：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm init -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="npm-install">&lt;code>npm install&lt;/code>
&lt;/h4>&lt;p>这是最核心、最常用的命令。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>别名&lt;/strong>: &lt;code>npm i&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>安装项目所有依赖&lt;/strong>:
如果你的项目里已经有 &lt;code>package.json&lt;/code> 和 &lt;code>package-lock.json&lt;/code> 文件，直接运行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>npm 会读取 &lt;code>package-lock.json&lt;/code> 并安装所有依赖到 &lt;code>node_modules&lt;/code> 文件夹。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>安装特定包&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装一个包，并将其添加到 &amp;#34;dependencies&amp;#34; (生产环境依赖)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install lodash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装一个包，并将其添加到 &amp;#34;devDependencies&amp;#34; (开发环境依赖)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 比如测试工具、打包工具等&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install jest --save-dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或者使用简写&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install jest -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>&lt;code>dependencies&lt;/code> vs &lt;code>devDependencies&lt;/code>&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;ul>
&lt;li>&lt;code>dependencies&lt;/code>: 你的应用在生产环境中运行时必须的包（如 React, Express）。&lt;/li>
&lt;li>&lt;code>devDependencies&lt;/code>: 只在开发和构建过程中需要的包（如 Webpack, ESLint, Jest）。&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>全局安装&lt;/strong>:
有些包是命令行工具（比如 &lt;code>nodemon&lt;/code>），需要全局安装才能在任何地方使用。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install -g nodemon
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>: 尽量避免过多全局安装，优先使用 &lt;code>npx&lt;/code> (后面会讲)。&lt;/p>
&lt;/blockquote>
&lt;p>以下是与依赖管理和冲突解决相关的常用参数：&lt;/p>
&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;th>对你的错误的适用场景&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>--legacy-peer-deps&lt;/code>&lt;/td>
&lt;td>忽略 peer dependency 冲突，使用旧版 npm 的解析逻辑。&lt;/td>
&lt;td>绕过 &lt;code>typescript&lt;/code> 与 &lt;code>react-scripts&lt;/code> 的版本冲突。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--force&lt;/code>&lt;/td>
&lt;td>强制安装，覆盖依赖冲突，可能忽略合法约束。&lt;/td>
&lt;td>作为最后手段解决无法解析的冲突。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--save&lt;/code>&lt;/td>
&lt;td>将包保存到 &lt;code>package.json&lt;/code> 的 &lt;code>dependencies&lt;/code> 中（npm &amp;lt; 7 默认行为）。&lt;/td>
&lt;td>添加新包时使用，非直接相关。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--save-dev&lt;/code>&lt;/td>
&lt;td>将包保存到 &lt;code>package.json&lt;/code> 的 &lt;code>devDependencies&lt;/code> 中。&lt;/td>
&lt;td>安装 &lt;code>typescript&lt;/code> 作为开发依赖时使用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--no-audit&lt;/code>&lt;/td>
&lt;td>跳过依赖的安全审计。&lt;/td>
&lt;td>加速安装，减少审计相关的延迟。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--no-fund&lt;/code>&lt;/td>
&lt;td>抑制 npm 的资助提示信息。&lt;/td>
&lt;td>提高输出日志的可读性。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--verbose&lt;/code>&lt;/td>
&lt;td>提供详细的安装日志输出。&lt;/td>
&lt;td>调试安装问题时查看更多日志信息。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--production&lt;/code>&lt;/td>
&lt;td>仅安装 &lt;code>dependencies&lt;/code>（跳过 &lt;code>devDependencies&lt;/code>）。&lt;/td>
&lt;td>生产环境部署时使用，与此问题无关。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--cache=&amp;lt;path&amp;gt;&lt;/code>&lt;/td>
&lt;td>指定自定义缓存目录。&lt;/td>
&lt;td>缓存问题持续存在时使用，较少需要。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="npm-uninstall">&lt;code>npm uninstall&lt;/code>
&lt;/h4>&lt;p>用于卸载一个包。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>别名&lt;/strong>: &lt;code>npm un&lt;/code>&lt;/li>
&lt;/ul>
&lt;!-- end list -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 卸载一个包，并将其从 package.json 中移除&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm uninstall lodash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 卸载一个开发依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm uninstall jest --save-dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm uninstall jest -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="npm-update">&lt;code>npm update&lt;/code>
&lt;/h4>&lt;p>用于将包更新到 &lt;code>package.json&lt;/code> 中指定的版本范围内的最新版本。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 更新所有包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 只更新特定的包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm update lodash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>注意&lt;/strong>: &lt;code>npm update&lt;/code> 比较保守，它会遵守 &lt;code>package.json&lt;/code> 中的版本规则（如 &lt;code>^&lt;/code> 或 &lt;code>~&lt;/code>）。它不会将包升级到一个新的主版本（Major version）。&lt;/p>
&lt;/blockquote>
&lt;h4 id="npm-run">&lt;code>npm run&lt;/code>
&lt;/h4>&lt;p>用于运行在 &lt;code>package.json&lt;/code> 文件中 &lt;code>scripts&lt;/code> 部分定义的脚本。&lt;/p>
&lt;p>假设你的 &lt;code>package.json&lt;/code> 如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;node index.js&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;test&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;jest&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;webpack&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>你可以这样运行脚本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行 start 脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 对于 &amp;#34;start&amp;#34;, &amp;#34;test&amp;#34;, &amp;#34;stop&amp;#34;, &amp;#34;restart&amp;#34;，可以省略 run&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行 test 脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm &lt;span class="nb">test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行 build 脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="npm-list">&lt;code>npm list&lt;/code>
&lt;/h4>&lt;p>用于查看当前项目安装了哪些包，以及它们的依赖关系。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看所有一级包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm list --depth&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看全局安装的包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm list -g --depth&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-深入理解-packagejson">5. 深入理解 &lt;code>package.json&lt;/code>
&lt;/h3>&lt;p>一个典型的 &lt;code>package.json&lt;/code> 文件结构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;my-project&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;A simple project.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;index.js&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;node index.js&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;keywords&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;tutorial&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;npm&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;author&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Your Name&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;license&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ISC&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dependencies&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;express&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;^4.18.2&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;devDependencies&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;nodemon&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;^2.0.22&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>&amp;quot;name&amp;quot;&lt;/code>: 包的名称，必须是唯一的、小写的，不能有空格。&lt;/li>
&lt;li>&lt;code>&amp;quot;version&amp;quot;&lt;/code>: 当前版本号，遵循&lt;a class="link" href="https://www.google.com/search?q=%236-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC-semver" target="_blank" rel="noopener"
>语义化版本&lt;/a>。&lt;/li>
&lt;li>&lt;code>&amp;quot;description&amp;quot;&lt;/code>: 项目描述。&lt;/li>
&lt;li>&lt;code>&amp;quot;main&amp;quot;&lt;/code>: 项目的入口文件。&lt;/li>
&lt;li>&lt;code>&amp;quot;scripts&amp;quot;&lt;/code>: 定义可执行的脚本命令。&lt;/li>
&lt;li>&lt;code>&amp;quot;dependencies&amp;quot;&lt;/code>: 生产环境依赖。&lt;/li>
&lt;li>&lt;code>&amp;quot;devDependencies&amp;quot;&lt;/code>: 开发环境依赖。&lt;/li>
&lt;/ul>
&lt;h3 id="6-版本管理语义化版本-semver">6. 版本管理：语义化版本 (SemVer)
&lt;/h3>&lt;p>npm 使用语义化版本来管理包的版本。版本号格式为 &lt;code>主版本号.次版本号.修订号&lt;/code> (&lt;code>MAJOR.MINOR.PATCH&lt;/code>)。&lt;/p>
&lt;ul>
&lt;li>&lt;code>MAJOR&lt;/code>: 当你做了不兼容的 API 修改。&lt;/li>
&lt;li>&lt;code>MINOR&lt;/code>: 当你做了向下兼容的功能性新增。&lt;/li>
&lt;li>&lt;code>PATCH&lt;/code>: 当你做了向下兼容的问题修正。&lt;/li>
&lt;/ul>
&lt;p>在 &lt;code>package.json&lt;/code> 中，你经常会看到版本号前面有 &lt;code>^&lt;/code> 或 &lt;code>~&lt;/code>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>^&lt;/code> (Caret): 锁定主版本号，允许次版本号和修订号更新。例如 &lt;code>^4.18.2&lt;/code> 匹配 &lt;code>&amp;gt;=4.18.2&lt;/code> 且 &lt;code>&amp;lt;5.0.0&lt;/code> 的所有版本。这是 &lt;code>npm install &amp;lt;package&amp;gt;&lt;/code> 的默认行为。&lt;/li>
&lt;li>&lt;code>~&lt;/code> (Tilde): 锁定主版本号和次版本号，只允许修订号更新。例如 &lt;code>~4.18.2&lt;/code> 匹配 &lt;code>&amp;gt;=4.18.2&lt;/code> 且 &lt;code>&amp;lt;4.19.0&lt;/code> 的所有版本。&lt;/li>
&lt;/ul>
&lt;h3 id="7-进阶命令">7. 进阶命令
&lt;/h3>&lt;h4 id="npm-outdated">&lt;code>npm outdated&lt;/code>
&lt;/h4>&lt;p>检查哪些包已经过时了，可以更新。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm outdated
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它会列出当前版本、期望版本和最新版本，非常方便。&lt;/p>
&lt;h4 id="npm-ci">&lt;code>npm ci&lt;/code>
&lt;/h4>&lt;p>这个命令用于持续集成 (Continuous Integration, CI) 环境，比如在 Jenkins 或 GitHub Actions 中。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm ci
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它和 &lt;code>npm install&lt;/code> 的区别：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>严格&lt;/strong>: 它完全根据 &lt;code>package-lock.json&lt;/code> 来安装，如果 &lt;code>package.json&lt;/code> 和 &lt;code>package-lock.json&lt;/code> 不一致，它会报错退出。&lt;/li>
&lt;li>&lt;strong>快速&lt;/strong>: 它会先删除现有的 &lt;code>node_modules&lt;/code>，然后进行一次全新的、干净的安装，通常比 &lt;code>npm install&lt;/code> 更快。&lt;/li>
&lt;li>&lt;strong>确定性&lt;/strong>: 保证了在任何机器上安装的依赖都是完全一致的。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>最佳实践&lt;/strong>: 在开发时使用 &lt;code>npm install&lt;/code>，在自动化构建和部署时使用 &lt;code>npm ci&lt;/code>。&lt;/p>
&lt;h4 id="npm-audit">&lt;code>npm audit&lt;/code>
&lt;/h4>&lt;p>扫描你的项目依赖，查找已知的安全漏洞。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm audit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果发现漏洞，它会提供报告，并可能提供修复命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm audit fix
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="npm-view">&lt;code>npm view&lt;/code>
&lt;/h4>&lt;p>在不安装的情况下，查看一个包的详细信息。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>别名&lt;/strong>: &lt;code>npm v&lt;/code>&lt;/li>
&lt;/ul>
&lt;!-- end list -->
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看 React 的所有版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm view react versions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看 Express 的最新版本信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm view express
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="npx">&lt;code>npx&lt;/code>
&lt;/h4>&lt;p>一个非常有用的工具，它允许你&lt;strong>执行&lt;/strong>一个 npm 包的命令，而不需要全局安装它。&lt;/p>
&lt;p>&lt;strong>场景&lt;/strong>: 假设你想用 &lt;code>create-react-app&lt;/code> 创建一个新的 React 项目。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>旧方式 (不推荐)&lt;/strong>: &lt;code>npm install -g create-react-app&lt;/code>，然后 &lt;code>create-react-app my-app&lt;/code>。这会把 &lt;code>create-react-app&lt;/code> 全局安装在你的系统里，可能很快就过时了。&lt;/li>
&lt;li>&lt;strong>新方式 (推荐)&lt;/strong>:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npx create-react-app my-app
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;code>npx&lt;/code> 会临时下载最新版的 &lt;code>create-react-app&lt;/code>，运行它，然后在命令结束后清理掉，不会污染你的全局环境。&lt;/li>
&lt;/ul>
&lt;h3 id="8-最佳实践和技巧">8. 最佳实践和技巧
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>始终提交 &lt;code>package-lock.json&lt;/code>&lt;/strong>: 确保团队协作和部署的一致性。&lt;/li>
&lt;li>&lt;strong>使用 &lt;code>.npmrc&lt;/code> 文件&lt;/strong>: 你可以在项目根目录或用户主目录下创建一个 &lt;code>.npmrc&lt;/code> 文件来配置 npm 的行为，比如设置私有仓库地址：&lt;code>registry=https://registry.npm.taobao.org&lt;/code> (如果你在中国，这可以加速下载)。&lt;/li>
&lt;li>&lt;strong>优先使用 &lt;code>npx&lt;/code>&lt;/strong>: 对于一次性的脚手架工具或不常用的命令，使用 &lt;code>npx&lt;/code> 而不是全局安装。&lt;/li>
&lt;li>&lt;strong>定期运行 &lt;code>npm outdated&lt;/code> 和 &lt;code>npm audit&lt;/code>&lt;/strong>: 保持你的依赖更新并关注安全问题。&lt;/li>
&lt;li>&lt;strong>理解 &lt;code>dependencies&lt;/code> 和 &lt;code>devDependencies&lt;/code> 的区别&lt;/strong>: 将包正确地归类，可以减小生产环境安装包的体积。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="npm-相关问题解决教程">npm 相关问题解决教程
&lt;/h2>&lt;h3 id="1-前端启动问题">1. 前端启动问题
&lt;/h3>&lt;h4 id="问题现象">问题现象
&lt;/h4>&lt;p>运行 &lt;code>npm run dev&lt;/code> 后，虽然显示服务器启动成功：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">VITE v4.5.14 ready in 123 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">➜ Local: http://localhost:3000/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">➜ Network: use --host to expose
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但访问 &lt;code>http://localhost:3000&lt;/code> 时出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ERR_EMPTY_RESPONSE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">127.0.0.1 未发送任何数据
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="解决方案">解决方案
&lt;/h4>&lt;h5 id="临时解决方案">临时解决方案
&lt;/h5>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm run dev -- --host 0.0.0.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="永久解决方案1修改-packagejson推荐">永久解决方案1：修改 package.json（推荐）
&lt;/h5>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dev&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite --host 0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite --host 0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;tsc &amp;amp;&amp;amp; vite build&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lint&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite preview&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="永久解决方案2修改-viteconfigts">永久解决方案2：修改 vite.config.ts
&lt;/h5>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">defineConfig&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;vite&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">react&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@vitejs/plugin-react&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">path&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;path&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="nx">defineConfig&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">plugins&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="nx">react&lt;/span>&lt;span class="p">()],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">resolve&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">alias&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;@&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">resolve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">__dirname&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;./src&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">server&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">host&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;0.0.0.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1">// 添加这行
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">port&lt;/span>: &lt;span class="kt">3000&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">proxy&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;/api&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">target&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;http://localhost:8000&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">changeOrigin&lt;/span>: &lt;span class="kt">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">secure&lt;/span>: &lt;span class="kt">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="永久解决方案3使用环境变量">永久解决方案3：使用环境变量
&lt;/h5>&lt;p>创建 &lt;code>frontend/.env&lt;/code> 文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">VITE_HOST&lt;/span>&lt;span class="o">=&lt;/span>0.0.0.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">VITE_PORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">3000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后在 &lt;code>vite.config.ts&lt;/code> 中使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="nx">defineConfig&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ... 其他配置
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">server&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">host&lt;/span>: &lt;span class="kt">process.env.VITE_HOST&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="s1">&amp;#39;0.0.0.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">port&lt;/span>: &lt;span class="kt">Number&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">VITE_PORT&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="mi">3000&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ... 其他配置
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-npm-脚本命令详解">2. npm 脚本命令详解
&lt;/h3>&lt;h4 id="内置脚本-vs-自定义脚本">内置脚本 vs 自定义脚本
&lt;/h4>&lt;h5 id="内置脚本不需要-run">内置脚本（不需要 &lt;code>run&lt;/code>）
&lt;/h5>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm start &lt;span class="c1"># 启动应用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm &lt;span class="nb">test&lt;/span> &lt;span class="c1"># 运行测试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm stop &lt;span class="c1"># 停止应用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm restart &lt;span class="c1"># 重启应用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install &lt;span class="c1"># 安装依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm uninstall &lt;span class="c1"># 卸载依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm update &lt;span class="c1"># 更新依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm publish &lt;span class="c1"># 发布包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm version &lt;span class="c1"># 版本管理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm pack &lt;span class="c1"># 打包&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="自定义脚本必须使用-run">自定义脚本（必须使用 &lt;code>run&lt;/code>）
&lt;/h5>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm run dev &lt;span class="c1"># 开发模式&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build &lt;span class="c1"># 构建生产版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run lint &lt;span class="c1"># 代码检查&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run preview &lt;span class="c1"># 预览构建结果&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="为什么-npm-start-不需要-run">为什么 &lt;code>npm start&lt;/code> 不需要 &lt;code>run&lt;/code>？
&lt;/h4>&lt;ol>
&lt;li>&lt;strong>历史原因&lt;/strong>：&lt;code>start&lt;/code> 和 &lt;code>test&lt;/code> 是最常用的命令，npm 从早期就支持直接调用&lt;/li>
&lt;li>&lt;strong>简化常用操作&lt;/strong>：启动和测试是最频繁的操作，简化输入提高效率&lt;/li>
&lt;li>&lt;strong>标准化约定&lt;/strong>：所有 npm 包都遵循这个约定&lt;/li>
&lt;/ol>
&lt;h4 id="实际验证">实际验证
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 这些命令完全等效&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm &lt;span class="nv">start&lt;/span> &lt;span class="o">===&lt;/span> npm run start
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm &lt;span class="nb">test&lt;/span> &lt;span class="o">===&lt;/span> npm run &lt;span class="nb">test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 但是 npm 允许省略 run（仅限内置脚本）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm start &lt;span class="c1"># ✅ 推荐写法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm &lt;span class="nb">test&lt;/span> &lt;span class="c1"># ✅ 推荐写法&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-常用-npm-脚本配置">3. 常用 npm 脚本配置
&lt;/h3>&lt;h4 id="基础配置">基础配置
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dev&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite --host 0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite --host 0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;tsc &amp;amp;&amp;amp; vite build&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lint&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite preview&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="进阶配置">进阶配置
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dev&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite --host 0.0.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;npm run dev&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;tsc &amp;amp;&amp;amp; vite build&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build:prod&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;NODE_ENV=production npm run build&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vite preview&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lint&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;eslint . --ext ts,tsx&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lint:fix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;eslint . --ext ts,tsx --fix&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;test&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vitest&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;test:watch&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;vitest --watch&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;clean&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;rm -rf dist node_modules/.vite&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;reinstall&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;rm -rf node_modules package-lock.json &amp;amp;&amp;amp; npm install&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-常见问题排查">4. 常见问题排查
&lt;/h3>&lt;h4 id="端口占用问题">端口占用问题
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查端口占用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lsof -i :3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">netstat -tlnp &lt;span class="p">|&lt;/span> grep :3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 杀死占用端口的进程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">kill&lt;/span> -9 &amp;lt;PID&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="清除缓存">清除缓存
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清除 npm 缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm cache clean --force
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清除 Vite 缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf node_modules/.vite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 完全重新安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf node_modules package-lock.json
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="网络问题">网络问题
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 测试本地连接&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -I http://localhost:3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -I http://127.0.0.1:3000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl -I http://0.0.0.0:3000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-脚本最佳实践">5. 脚本最佳实践
&lt;/h3>&lt;h4 id="脚本命名约定">脚本命名约定
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;启动应用（通常是生产环境）&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;dev&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;开发模式启动&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;构建生产版本&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build:dev&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;构建开发版本&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;build:prod&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;构建生产版本&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;test&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;运行测试&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;test:watch&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;监听模式运行测试&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lint&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;代码检查&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;lint:fix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;代码检查并自动修复&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preview&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;预览构建结果&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;clean&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;清理构建文件&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="参数传递">参数传递
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 向脚本传递参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run dev -- --port &lt;span class="m">3001&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run build -- --mode production
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在 package.json 中使用参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;dev&amp;#34;&lt;/span>: &lt;span class="s2">&amp;#34;vite --host 0.0.0.0 --port 3000&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-问题解决总结">6. 问题解决总结
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>问题核心&lt;/strong>：Vite 默认只绑定 localhost，需要添加 &lt;code>--host 0.0.0.0&lt;/code>&lt;/li>
&lt;li>&lt;strong>推荐方案&lt;/strong>：直接在 package.json 中配置参数&lt;/li>
&lt;li>&lt;strong>npm 命令&lt;/strong>：内置脚本不需要 &lt;code>run&lt;/code>，自定义脚本需要 &lt;code>run&lt;/code>&lt;/li>
&lt;li>&lt;strong>最佳实践&lt;/strong>：使用标准的脚本命名约定，方便团队协作&lt;/li>
&lt;/ul>
&lt;hr></description></item><item><title>包管理工具poetry使用教程</title><link>https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7poetry%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Tue, 13 May 2025 17:59:15 +0800</pubDate><guid>https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7poetry%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7poetry%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post 包管理工具poetry使用教程" />&lt;p>Poetry 是一个 Python 的依赖管理和项目打包工具，旨在简化 Python 项目的工作流程。本教程将涵盖安装、基本使用、常见命令和一些实用技巧，适合初学者和有一定经验的用户。&lt;/p>
&lt;hr>
&lt;h2 id="1-什么是-poetry">1. 什么是 Poetry？
&lt;/h2>&lt;p>Poetry 是一个用于管理 Python 项目依赖、虚拟环境和打包的工具。它通过一个 &lt;code>pyproject.toml&lt;/code> 文件统一管理项目的元数据、依赖和构建配置。相比传统的 &lt;code>pip&lt;/code> 和 &lt;code>requirements.txt&lt;/code>，Poetry 提供了更现代化的工作流。&lt;/p>
&lt;p>主要特点：&lt;/p>
&lt;ul>
&lt;li>自动管理虚拟环境&lt;/li>
&lt;li>精确的依赖解析，避免版本冲突&lt;/li>
&lt;li>简化的项目打包和发布流程&lt;/li>
&lt;li>支持 &lt;code>pyproject.toml&lt;/code>，符合 PEP 517/518 标准&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-安装-poetry">2. 安装 Poetry
&lt;/h2>&lt;h3 id="21-安装-poetry">2.1 安装 Poetry
&lt;/h3>&lt;p>在 Linux、macOS 或 Windows（推荐使用 WSL 或 PowerShell）上，可以通过以下命令安装 Poetry：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -sSL https://install.python-poetry.org &lt;span class="p">|&lt;/span> python3 -
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者使用 pip（不推荐，但可用）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install poetry
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="22-验证安装">2.2 验证安装
&lt;/h3>&lt;p>安装完成后，检查 Poetry 版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出类似：&lt;code>Poetry (version 1.8.3)&lt;/code> 表示安装成功。&lt;/p>
&lt;h3 id="23-配置-poetry">2.3 配置 Poetry
&lt;/h3>&lt;p>默认情况下，Poetry 会在每个项目中创建虚拟环境。你可以配置全局设置，例如让虚拟环境存储在项目目录内：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry config virtualenvs.in-project &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查看所有配置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry config --list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="3-创建一个新项目">3. 创建一个新项目
&lt;/h2>&lt;h3 id="31-初始化项目">3.1 初始化项目
&lt;/h3>&lt;p>在终端中，创建一个新项目：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry new my-project
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会生成以下目录结构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">my-project/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── pyproject.toml # 项目配置文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── README.md # 项目说明文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── my_project/ # 代码目录
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── __init__.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── tests/ # 测试目录
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── __init__.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="32-使用现有项目">3.2 使用现有项目
&lt;/h3>&lt;p>如果你有一个现有的 Python 项目，可以进入项目目录并初始化 Poetry：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> my-existing-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">poetry init
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会引导你交互式地创建 &lt;code>pyproject.toml&lt;/code> 文件，输入项目名称、版本、依赖等信息。&lt;/p>
&lt;hr>
&lt;h2 id="4-管理依赖">4. 管理依赖
&lt;/h2>&lt;h3 id="41-添加依赖">4.1 添加依赖
&lt;/h3>&lt;p>使用 &lt;code>poetry add&lt;/code> 安装依赖并自动更新 &lt;code>pyproject.toml&lt;/code> 和 &lt;code>poetry.lock&lt;/code> 文件。例如，安装 &lt;code>requests&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry add requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>指定版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry add requests@^2.28.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>开发依赖（仅用于开发环境，例如测试工具）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry add pytest --group dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="42-移除依赖">4.2 移除依赖
&lt;/h3>&lt;p>移除某个依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry remove requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="43-查看依赖">4.3 查看依赖
&lt;/h3>&lt;p>列出所有已安装的依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry show
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>显示依赖树：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry show --tree
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="44-锁定依赖">4.4 锁定依赖
&lt;/h3>&lt;p>Poetry 使用 &lt;code>poetry.lock&lt;/code> 文件锁定依赖的确切版本，确保一致性。更新锁文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry lock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果只想更新依赖到最新兼容版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="5-管理虚拟环境">5. 管理虚拟环境
&lt;/h2>&lt;h3 id="51-激活虚拟环境">5.1 激活虚拟环境
&lt;/h3>&lt;p>Poetry 自动为项目创建虚拟环境。激活虚拟环境：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry shell
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>退出虚拟环境：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-在虚拟环境中运行命令">5.2 在虚拟环境中运行命令
&lt;/h3>&lt;p>不进入 &lt;code>shell&lt;/code> 也可以直接运行命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry run python my_script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>运行测试（例如使用 pytest）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry run pytest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="53-检查虚拟环境">5.3 检查虚拟环境
&lt;/h3>&lt;p>查看当前虚拟环境路径：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry env info
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>列出所有虚拟环境：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry env list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>删除虚拟环境：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry env remove python3.10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="6-打包和发布项目">6. 打包和发布项目
&lt;/h2>&lt;h3 id="61-配置项目">6.1 配置项目
&lt;/h3>&lt;p>编辑 &lt;code>pyproject.toml&lt;/code>，确保 &lt;code>[tool.poetry]&lt;/code> 部分包含正确的元数据，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">tool&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">poetry&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;my-project&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">version&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;0.1.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;A sample Python project&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">authors&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Your Name &amp;lt;your.email@example.com&amp;gt;&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">readme&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;README.md&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">tool&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">poetry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">dependencies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">python&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;^3.8&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">requests&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;^2.28.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">tool&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">poetry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">group&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">dev&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">dependencies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">pytest&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;^7.2.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="62-构建项目">6.2 构建项目
&lt;/h3>&lt;p>生成项目的 &lt;code>wheel&lt;/code> 或 &lt;code>sdist&lt;/code> 文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出文件会出现在 &lt;code>dist/&lt;/code> 目录中，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">dist/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── my_project-0.1.0-py3-none-any.whl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── my_project-0.1.0.tar.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="63-发布到-pypi">6.3 发布到 PyPI
&lt;/h3>&lt;p>配置 PyPI 的 token（在 PyPI 官网生成）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry config pypi-token.pypi your-api-token
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>发布项目：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry publish
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果发布到测试 PyPI：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry publish --repository testpypi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="7-常用命令速查">7. 常用命令速查
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>命令&lt;/th>
&lt;th>功能&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>poetry new &amp;lt;name&amp;gt;&lt;/code>&lt;/td>
&lt;td>创建新项目&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry init&lt;/code>&lt;/td>
&lt;td>初始化现有项目&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry add &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>添加依赖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry remove &amp;lt;package&amp;gt;&lt;/code>&lt;/td>
&lt;td>移除依赖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry install&lt;/code>&lt;/td>
&lt;td>安装所有依赖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry update&lt;/code>&lt;/td>
&lt;td>更新依赖到最新兼容版本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry lock&lt;/code>&lt;/td>
&lt;td>锁定依赖版本&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry shell&lt;/code>&lt;/td>
&lt;td>进入虚拟环境&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry run &amp;lt;command&amp;gt;&lt;/code>&lt;/td>
&lt;td>在虚拟环境中运行命令&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry build&lt;/code>&lt;/td>
&lt;td>构建项目&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry publish&lt;/code>&lt;/td>
&lt;td>发布项目到 PyPI&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>poetry env info&lt;/code>&lt;/td>
&lt;td>查看虚拟环境信息&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="8-实用技巧">8. 实用技巧
&lt;/h2>&lt;h3 id="81-使用特定-python-版本">8.1 使用特定 Python 版本
&lt;/h3>&lt;p>如果系统中安装了多个 Python 版本，可以指定 Poetry 使用的版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry env use python3.10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="82-导出-requirementstxt">8.2 导出 requirements.txt
&lt;/h3>&lt;p>如果需要与不支持 Poetry 的工具兼容，可以导出依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry &lt;span class="nb">export&lt;/span> -f requirements.txt --output requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="83-管理多个依赖组">8.3 管理多个依赖组
&lt;/h3>&lt;p>Poetry 支持依赖分组。例如，添加文档生成工具到 &lt;code>docs&lt;/code> 组：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry add sphinx --group docs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装特定组的依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry install --only docs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="84-解决依赖冲突">8.4 解决依赖冲突
&lt;/h3>&lt;p>如果依赖解析失败，检查 &lt;code>poetry.lock&lt;/code> 或运行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry lock --no-update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="85-集成-ide">8.5 集成 IDE
&lt;/h3>&lt;p>大多数现代 IDE（如 PyCharm、VS Code）支持 Poetry。确保 IDE 指向 Poetry 创建的虚拟环境路径（通过 &lt;code>poetry env info&lt;/code> 查看）。&lt;/p>
&lt;hr>
&lt;h2 id="9-常见问题">9. 常见问题
&lt;/h2>&lt;h3 id="91-poetry-安装依赖很慢">9.1 Poetry 安装依赖很慢？
&lt;/h3>&lt;p>尝试设置国内镜像（例如清华源）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry config pypi-mirror https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="92-虚拟环境未激活">9.2 虚拟环境未激活？
&lt;/h3>&lt;p>确保运行 &lt;code>poetry shell&lt;/code> 或 &lt;code>poetry run&lt;/code>。如果仍无效，检查是否正确安装了 Python 和 Poetry。&lt;/p>
&lt;h3 id="93-如何升级-poetry">9.3 如何升级 Poetry？
&lt;/h3>&lt;p>升级到最新版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry self update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="10-资源推荐">10. 资源推荐
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>官方文档&lt;/strong>：https://python-poetry.org/docs/&lt;/li>
&lt;li>&lt;strong>PyPI&lt;/strong>：https://pypi.org/&lt;/li>
&lt;li>&lt;strong>Poetry GitHub&lt;/strong>：https://github.com/python-poetry/poetry&lt;/li>
&lt;li>&lt;strong>社区讨论&lt;/strong>：在 X 平台搜索 &lt;code>#Poetry&lt;/code> 或 &lt;code>#Python&lt;/code> 获取最新动态&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h1 id="poetry-和-uv">Poetry 和 uv
&lt;/h1>&lt;p>以下是对 Poetry 和 uv 的对比分析，帮你理解它们的相似点和不同点。&lt;/p>
&lt;hr>
&lt;h2 id="1-相似点">1. 相似点
&lt;/h2>&lt;p>Poetry 和 uv 都是现代化的 Python 工具，旨在改进传统的 &lt;code>pip&lt;/code> 和 &lt;code>requirements.txt&lt;/code> 工作流。它们的共同点包括：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>依赖管理&lt;/strong>：两者都提供依赖解析和锁定功能，生成精确的依赖文件（Poetry 用 &lt;code>poetry.lock&lt;/code>，uv 用 &lt;code>uv.lock&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>虚拟环境&lt;/strong>：自动创建和管理虚拟环境，隔离项目依赖。&lt;/li>
&lt;li>&lt;strong>项目配置&lt;/strong>：基于 &lt;code>pyproject.toml&lt;/code> 文件管理项目元数据和依赖，符合 PEP 517/518。&lt;/li>
&lt;li>&lt;strong>命令行接口&lt;/strong>：提供简洁的 CLI 命令（如 &lt;code>add&lt;/code>、&lt;code>install&lt;/code>、&lt;code>run&lt;/code>）来管理依赖和运行脚本。&lt;/li>
&lt;li>&lt;strong>打包支持&lt;/strong>：都支持构建和发布 Python 包到 PyPI。&lt;/li>
&lt;li>&lt;strong>现代化体验&lt;/strong>：目标是简化工作流，解决 &lt;code>pip&lt;/code> 的依赖冲突和环境管理问题。&lt;/li>
&lt;/ul>
&lt;p>这些相似点让你感觉它们“很像”，因为它们都在解决 Python 生态中类似的问题。&lt;/p>
&lt;hr>
&lt;h2 id="2-不同点">2. 不同点
&lt;/h2>&lt;p>尽管功能上有重叠，Poetry 和 uv 在设计理念、性能和使用场景上有显著差异：&lt;/p>
&lt;h3 id="21-设计理念">2.1 设计理念
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>专注于 Python 项目的&lt;strong>全生命周期管理&lt;/strong>，包括依赖管理、虚拟环境、打包和发布。&lt;/li>
&lt;li>强调&lt;strong>用户友好&lt;/strong>和&lt;strong>跨平台一致性&lt;/strong>，适合开发者和小型团队。&lt;/li>
&lt;li>提供一体化的工作流，适合需要从项目创建到发布的完整工具链的场景。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>由 Astral 团队（Ruff 开发者）开发，定位为&lt;strong>高性能&lt;/strong>的 Python 工具链。&lt;/li>
&lt;li>更专注于&lt;strong>速度&lt;/strong>和&lt;strong>效率&lt;/strong>，用 Rust 编写，解析和安装依赖的速度远超 Poetry。&lt;/li>
&lt;li>设计上更模块化，适合需要快速迭代或大型项目的高级用户。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="22-性能">2.2 性能
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>使用 Python 编写，依赖解析和安装速度相对较慢，尤其在复杂项目中。&lt;/li>
&lt;li>依赖解析有时会因兼容性检查而耗时。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>用 Rust 编写，依赖解析和安装速度极快（官方宣称比 Poetry 快 10-100 倍）。&lt;/li>
&lt;li>优化了缓存和并行下载，适合 CI/CD 和大规模项目。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="23-功能侧重">2.3 功能侧重
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>提供内置的&lt;strong>项目初始化&lt;/strong>（&lt;code>poetry new&lt;/code>）和&lt;strong>发布工具&lt;/strong>（&lt;code>poetry publish&lt;/code>）。&lt;/li>
&lt;li>支持&lt;strong>依赖分组&lt;/strong>（如 &lt;code>dev&lt;/code>、&lt;code>docs&lt;/code>），方便管理不同用途的依赖。&lt;/li>
&lt;li>更适合&lt;strong>小型到中型项目&lt;/strong>或需要简单配置的开发者。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>提供更灵活的&lt;strong>工具链&lt;/strong>，包括依赖管理、脚本运行、Python 版本管理和项目工作流。&lt;/li>
&lt;li>支持&lt;strong>工作空间&lt;/strong>（workspaces），适合管理 monorepo 或多项目结构。&lt;/li>
&lt;li>更适合&lt;strong>高级用户&lt;/strong>或需要高性能的场景，如 CI/CD 流水线或大型项目。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="24-虚拟环境管理">2.4 虚拟环境管理
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>自动为每个项目创建虚拟环境，默认存储在全局缓存目录（可配置为项目内）。&lt;/li>
&lt;li>使用 &lt;code>poetry shell&lt;/code> 进入虚拟环境，体验类似传统虚拟环境。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>虚拟环境管理更轻量，创建速度更快，默认存储在项目目录下的 &lt;code>.venv&lt;/code>。&lt;/li>
&lt;li>支持直接运行命令（&lt;code>uv run&lt;/code>）而无需显式激活环境，简化工作流。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="25-依赖解析">2.5 依赖解析
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>使用 &lt;code>poetry.lock&lt;/code> 锁定依赖版本，解析过程较为严格，确保跨环境一致性。&lt;/li>
&lt;li>依赖解析有时过于谨慎，可能拒绝安装不完全兼容的版本。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>使用 &lt;code>uv.lock&lt;/code>（基于 lockfiles 的新标准），解析更灵活且速度更快。&lt;/li>
&lt;li>支持&lt;strong>增量解析&lt;/strong>，在 CI/CD 中减少重复工作。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="26-生态集成">2.6 生态集成
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>与现有 Python 生态（如 PyPI、pytest）集成良好，社区成熟。&lt;/li>
&lt;li>对 IDE（如 PyCharm、VS Code）的支持更友好，配置简单。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>生态还在快速发展，部分功能（如发布工具）不如 Poetry 成熟。&lt;/li>
&lt;li>与 Ruff（Astral 的代码检查工具）深度集成，适合追求全栈 Rust 工具链的用户。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="27-学习曲线和社区">2.7 学习曲线和社区
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;ul>
&lt;li>文档全面，社区活跃，学习曲线较平缓。&lt;/li>
&lt;li>适合初学者和需要稳定工具的开发者。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;ul>
&lt;li>文档正在完善，功能迭代很快，可能需要更多摸索。&lt;/li>
&lt;li>更适合有经验的开发者或愿意尝试新工具的用户。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="3-代码示例对比">3. 代码示例对比
&lt;/h2>&lt;p>为了直观感受它们的相似与不同，下面是对常见任务的命令对比：&lt;/p>
&lt;h3 id="31-创建项目">3.1 创建项目
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry new my-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> my-project
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>生成带 &lt;code>pyproject.toml&lt;/code> 的项目结构。&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv init my-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> my-project
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>生成简化的项目结构，包含 &lt;code>pyproject.toml&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h3 id="32-添加依赖">3.2 添加依赖
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry add requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>更新 &lt;code>pyproject.toml&lt;/code> 和 &lt;code>poetry.lock&lt;/code>。&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv add requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>更新 &lt;code>pyproject.toml&lt;/code> 和 &lt;code>uv.lock&lt;/code>，速度更快。&lt;/li>
&lt;/ul>
&lt;h3 id="33-运行脚本">3.3 运行脚本
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry run python my_script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>或进入虚拟环境：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry shell
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python my_script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv run python my_script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>无需显式激活虚拟环境。&lt;/li>
&lt;/ul>
&lt;h3 id="34-锁定依赖">3.4 锁定依赖
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry lock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv lock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="35-安装依赖">3.5 安装依赖
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">poetry install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv sync
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-为什么感觉很像">4. 为什么感觉很像？
&lt;/h2>&lt;p>你感觉 Poetry 和 uv 很像，可能因为：&lt;/p>
&lt;ul>
&lt;li>两者都使用 &lt;code>pyproject.toml&lt;/code> 作为核心配置文件，命令结构类似（&lt;code>add&lt;/code>、&lt;code>run&lt;/code> 等）。&lt;/li>
&lt;li>都旨在取代 &lt;code>pip&lt;/code> 和 &lt;code>virtualenv&lt;/code>，提供更现代的工作流。&lt;/li>
&lt;li>在基本操作（如添加依赖、运行脚本）上，命令和输出体验接近。&lt;/li>
&lt;/ul>
&lt;p>但 uv 的高性能（得益于 Rust）和模块化设计使其更像一个“下一代”工具，而 Poetry 更像一个成熟的“全家桶”解决方案。&lt;/p>
&lt;hr>
&lt;h2 id="5-选择哪个">5. 选择哪个？
&lt;/h2>&lt;h3 id="选择-poetry-如果">选择 Poetry 如果：
&lt;/h3>&lt;ul>
&lt;li>你想要一个&lt;strong>稳定、成熟&lt;/strong>的工具，文档和社区支持完善。&lt;/li>
&lt;li>你是初学者或需要简单的项目管理流程。&lt;/li>
&lt;li>你重视&lt;strong>跨平台一致性&lt;/strong>和&lt;strong>发布到 PyPI&lt;/strong> 的便捷性。&lt;/li>
&lt;li>你不需要极致的性能，中小型项目足够。&lt;/li>
&lt;/ul>
&lt;h3 id="选择-uv-如果">选择 uv 如果：
&lt;/h3>&lt;ul>
&lt;li>你追求&lt;strong>高性能&lt;/strong>，特别是在 CI/CD 或大型项目中。&lt;/li>
&lt;li>你需要管理&lt;strong>复杂项目结构&lt;/strong>（如 monorepo）。&lt;/li>
&lt;li>你愿意尝试新工具并接受快速迭代的生态。&lt;/li>
&lt;li>你已经使用 Ruff 或其他 Astral 工具，想保持工具链一致。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-总结">6. 总结
&lt;/h2>&lt;p>Poetry 和 uv 在功能上有重叠，都简化了 Python 依赖管理和项目工作流，但它们的侧重点不同：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Poetry&lt;/strong>：成熟、用户友好，适合中小型项目和完整工作流。&lt;/li>
&lt;li>&lt;strong>uv&lt;/strong>：高性能、模块化，适合高级用户和大规模项目。&lt;/li>
&lt;/ul>
&lt;p>如果你刚开始，Poetry 可能更易上手；如果你追求速度或复杂项目管理，uv 可能是更好的选择。可以根据项目需求尝试两者，甚至在不同项目中混用（不过要注意虚拟环境隔离）。&lt;/p>
&lt;p>如果你有具体场景（比如某个任务想对比 Poetry 和 uv 的用法），可以告诉我，我可以进一步细化说明！&lt;/p></description></item><item><title>pipx使用教程</title><link>https://www.zata.cc/p/pipx%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Mon, 12 May 2025 14:32:42 +0800</pubDate><guid>https://www.zata.cc/p/pipx%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/pipx%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post pipx使用教程" />&lt;p>参考：&lt;/p>
&lt;p>&lt;a class="link" href="https://pipx.pypa.io/stable" target="_blank" rel="noopener"
>https://pipx.pypa.io/stable&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://zhuanlan.zhihu.com/p/637791135" target="_blank" rel="noopener"
>https://zhuanlan.zhihu.com/p/637791135&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://www.kancloud.cn/madxzb/python-guide/2248088" target="_blank" rel="noopener"
>https://www.kancloud.cn/madxzb/python-guide/2248088&lt;/a>&lt;/p>
&lt;hr>
&lt;p>&lt;code>pipx&lt;/code> 是一个帮助你安装和运行 Python 终端应用的工具，它的主要优点是能将这些应用安装在独立隔离的环境中，避免与系统或其他项目的 Python 包产生冲突。&lt;/p>
&lt;h2 id="pipx-的核心优势">&lt;strong>&lt;code>pipx&lt;/code> 的核心优势：&lt;/strong>
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>隔离性：&lt;/strong> 每个通过 &lt;code>pipx&lt;/code> 安装的应用都有自己独立虚拟环境，这意味着它们的依赖项不会影响到你的全局 Python 环境或其他项目。&lt;/li>
&lt;li>&lt;strong>便利性：&lt;/strong> 可以轻松地运行 Python 应用，而无需手动创建和管理虚拟环境。&lt;/li>
&lt;li>&lt;strong>安全性：&lt;/strong> 减少了全局安装 Python 包可能带来的风险。&lt;/li>
&lt;li>&lt;strong>简洁性：&lt;/strong> 专注于应用本身，而不是其复杂的依赖关系。&lt;/li>
&lt;/ul>
&lt;h2 id="教程大纲">&lt;strong>教程大纲：&lt;/strong>
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>安装 &lt;code>pipx&lt;/code>&lt;/strong>&lt;/li>
&lt;li>&lt;strong>&lt;code>pipx&lt;/code> 的基本使用&lt;/strong>
&lt;ul>
&lt;li>安装 Python 应用&lt;/li>
&lt;li>运行应用&lt;/li>
&lt;li>列出已安装的应用&lt;/li>
&lt;li>升级应用&lt;/li>
&lt;li>卸载应用&lt;/li>
&lt;li>运行一次性的应用 (使用 &lt;code>pipx run&lt;/code>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>&lt;code>pipx&lt;/code> 的进阶使用&lt;/strong>
&lt;ul>
&lt;li>管理 &lt;code>pipx&lt;/code> 环境&lt;/li>
&lt;li>自定义 &lt;code>pipx&lt;/code> 安装位置&lt;/li>
&lt;li>注入额外的包到应用环境中&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>常用命令总结&lt;/strong>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="1-安装-pipx">&lt;strong>1. 安装 &lt;code>pipx&lt;/code>&lt;/strong>
&lt;/h2>&lt;p>&lt;code>pipx&lt;/code> 本身也是一个 Python 包，你可以使用 &lt;code>pip&lt;/code> 来安装它。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>如果你使用的是 Python 3.6 或更高版本 (推荐)：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python3 -m pip install --user pipx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python3 -m pipx ensurepath
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>--user&lt;/code> 参数会将 &lt;code>pipx&lt;/code> 安装在你的用户目录下，而不是系统全局目录。&lt;code>pipx ensurepath&lt;/code> 命令会确保 &lt;code>pipx&lt;/code> 安装的可执行文件路径被添加到你的系统 &lt;code>PATH&lt;/code> 环境变量中。执行完此命令后，你可能需要&lt;strong>重启你的终端或者重新加载你的 shell 配置文件&lt;/strong> (例如 &lt;code>.bashrc&lt;/code>, &lt;code>.zshrc&lt;/code>) 才能让 &lt;code>PATH&lt;/code> 的改动生效。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>使用包管理器 (例如 Homebrew on macOS, apt on Debian/Ubuntu)：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>macOS (使用 Homebrew):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">brew install pipx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pipx ensurepath
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>Debian/Ubuntu (可能需要较新版本)：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install pipx
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pipx ensurepath
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>(注意：通过系统包管理器安装的版本可能不是最新的。)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>验证安装：&lt;/strong>&lt;/p>
&lt;p>打开一个新的终端窗口，然后输入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果安装成功，你会看到 &lt;code>pipx&lt;/code> 的版本号。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-pipx-的基本使用">&lt;strong>2. &lt;code>pipx&lt;/code> 的基本使用&lt;/strong>
&lt;/h2>&lt;p>&lt;strong>2.1 安装 Python 应用&lt;/strong>&lt;/p>
&lt;p>使用 &lt;code>pipx install &amp;lt;package_name&amp;gt;&lt;/code> 命令来安装一个 Python 应用。&lt;code>pipx&lt;/code> 会自动为这个应用创建一个新的隔离环境，并将应用的可执行文件链接到 &lt;code>~/.local/bin&lt;/code> (默认情况下)。&lt;/p>
&lt;p>&lt;strong>示例：&lt;/strong> 安装 &lt;code>cowsay&lt;/code> (一个经典的终端程序)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx install cowsay
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例：&lt;/strong> 安装 &lt;code>youtube-dl&lt;/code> 或其现代替代品 &lt;code>yt-dlp&lt;/code> (一个视频下载工具)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx install yt-dlp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例：&lt;/strong> 安装 &lt;code>black&lt;/code> (一个 Python 代码格式化工具)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx install black
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装完成后，如果 &lt;code>~/.local/bin&lt;/code> 在你的 &lt;code>PATH&lt;/code> 中，你就可以直接在终端运行这些应用了。&lt;/p>
&lt;p>&lt;strong>2.2 运行应用&lt;/strong>&lt;/p>
&lt;p>一旦通过 &lt;code>pipx&lt;/code> 安装了应用，你就可以像运行其他任何终端命令一样运行它。&lt;/p>
&lt;p>&lt;strong>示例：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cowsay &lt;span class="s2">&amp;#34;Hello from pipx!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">yt-dlp --version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">black --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2.3 列出已安装的应用&lt;/strong>&lt;/p>
&lt;p>要查看所有通过 &lt;code>pipx&lt;/code> 安装的应用及其环境信息，使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出会显示每个应用的版本、Python 版本、可执行文件路径等。&lt;/p>
&lt;p>&lt;strong>2.4 升级应用&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>升级单个应用：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx upgrade &amp;lt;package_name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如，升级 &lt;code>yt-dlp&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx upgrade yt-dlp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>升级所有已安装的应用：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx upgrade-all
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2.5 卸载应用&lt;/strong>&lt;/p>
&lt;p>要移除一个通过 &lt;code>pipx&lt;/code> 安装的应用及其隔离环境，使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx uninstall &amp;lt;package_name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如，卸载 &lt;code>cowsay&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx uninstall cowsay
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2.6 运行一次性的应用 (使用 &lt;code>pipx run&lt;/code>)&lt;/strong>&lt;/p>
&lt;p>如果你只是想临时运行一个 Python 应用，而不想永久安装它，可以使用 &lt;code>pipx run&lt;/code> 命令。&lt;code>pipx&lt;/code> 会在一个临时的虚拟环境中下载并运行该应用，运行结束后会自动清理环境。&lt;/p>
&lt;p>这对于那些你不经常使用，或者只是想尝试一下的工具非常有用。&lt;/p>
&lt;p>&lt;strong>示例：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>运行 &lt;code>cowsay&lt;/code> 并传递参数，而无需先 &lt;code>pipx install cowsay&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx run cowsay &lt;span class="s2">&amp;#34;Temporary moo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>运行一个简单的 HTTP 服务器 (Python 内置的 &lt;code>http.server&lt;/code> 模块)：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx run http.server -- --directory /path/to/your/files &lt;span class="m">8000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意：当应用本身也需要接收参数时，你可能需要在应用参数前加上 &lt;code>--&lt;/code>，以告诉 &lt;code>pipx&lt;/code> 后面的参数是给应用而不是给 &lt;code>pipx run&lt;/code> 命令的。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>运行特定版本的应用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx run &lt;span class="nv">black&lt;/span>&lt;span class="o">==&lt;/span>22.3.0 --check .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="3-pipx-的进阶使用">&lt;strong>3. &lt;code>pipx&lt;/code> 的进阶使用&lt;/strong>
&lt;/h2>&lt;p>&lt;strong>3.1 管理 &lt;code>pipx&lt;/code> 环境&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>重新安装所有包：&lt;/strong>
如果 &lt;code>pipx&lt;/code> 的内部结构或 Python 版本发生变化，你可能需要重新安装所有应用。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx reinstall-all
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>查看某个应用的详细信息：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx list --include-injected &amp;lt;package_name&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会显示应用的安装路径、Python 版本以及任何通过 &lt;code>pipx inject&lt;/code> 注入的额外包。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>3.2 自定义 &lt;code>pipx&lt;/code> 安装位置&lt;/strong>&lt;/p>
&lt;p>默认情况下，&lt;code>pipx&lt;/code> 将环境安装在 &lt;code>~/.local/pipx/venvs&lt;/code>，可执行文件链接到 &lt;code>~/.local/bin&lt;/code>。你可以通过环境变量来修改这些路径：&lt;/p>
&lt;ul>
&lt;li>&lt;code>PIPX_HOME&lt;/code>: 定义 &lt;code>pipx&lt;/code> 安装环境和元数据的根目录 (默认为 &lt;code>~/.local/pipx&lt;/code>)。&lt;/li>
&lt;li>&lt;code>PIPX_BIN_DIR&lt;/code>: 定义 &lt;code>pipx&lt;/code> 链接应用可执行文件的目录 (默认为 &lt;code>~/.local/bin&lt;/code>)。&lt;/li>
&lt;/ul>
&lt;p>如果你修改了这些变量，记得也要更新你的 &lt;code>PATH&lt;/code> 环境变量，并可能需要运行 &lt;code>pipx ensurepath&lt;/code> 来帮助你设置。&lt;/p>
&lt;p>&lt;strong>示例 (在你的 &lt;code>.bashrc&lt;/code> 或 &lt;code>.zshrc&lt;/code> 中设置)：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PIPX_HOME&lt;/span>&lt;span class="o">=&lt;/span>/opt/pipx_venvs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PIPX_BIN_DIR&lt;/span>&lt;span class="o">=&lt;/span>/opt/pipx_bin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$PIPX_BIN_DIR&lt;/span>&lt;span class="s2">:&lt;/span>&lt;span class="nv">$PATH&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="c1"># 确保新的 bin 目录在 PATH 中&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修改后请重新加载 shell 配置或重启终端。&lt;/p>
&lt;p>&lt;strong>3.3 注入额外的包到应用环境中 (&lt;code>pipx inject&lt;/code>)&lt;/strong>&lt;/p>
&lt;p>有时，一个通过 &lt;code>pipx&lt;/code> 安装的应用可能需要一些可选的依赖或插件才能启用特定功能。你可以使用 &lt;code>pipx inject&lt;/code> 命令将额外的包安装到该应用已存在的隔离环境中。&lt;/p>
&lt;p>&lt;strong>示例：&lt;/strong>&lt;/p>
&lt;p>假设你安装了 &lt;code>black&lt;/code>，并且想为它安装 &lt;code>jupyter&lt;/code> 插件（注意：这只是一个假设的例子，&lt;code>black&lt;/code> 本身可能不需要这样操作，具体看应用文档）。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx install black
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pipx inject black some-black-plugin another-plugin
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>查看注入的包：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx list --include-injected black
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>谨慎使用 &lt;code>inject&lt;/code>：&lt;/strong> &lt;code>inject&lt;/code> 的主要目的是为了应用的插件或可选依赖。过度使用 &lt;code>inject&lt;/code> 来构建复杂的环境可能会违背 &lt;code>pipx&lt;/code> 保持应用隔离和简洁的初衷。如果一个应用需要很多额外的包才能运行，可能它更适合通过 &lt;code>pip&lt;/code> 在一个专门的虚拟环境中进行管理 (例如使用 &lt;code>venv&lt;/code> 或 &lt;code>conda&lt;/code>)。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-常用命令总结">&lt;strong>4. 常用命令总结&lt;/strong>
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">命令&lt;/th>
&lt;th style="text-align: left">描述&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx install &amp;lt;pkg&amp;gt;&lt;/code>&lt;/td>
&lt;td style="text-align: left">安装一个 Python 应用到隔离环境。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx run &amp;lt;pkg&amp;gt; [args...]&lt;/code>&lt;/td>
&lt;td style="text-align: left">在临时环境中运行一个 Python 应用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx uninstall &amp;lt;pkg&amp;gt;&lt;/code>&lt;/td>
&lt;td style="text-align: left">卸载一个应用及其环境。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx uninstall-all&lt;/code>&lt;/td>
&lt;td style="text-align: left">卸载所有通过 &lt;code>pipx&lt;/code> 安装的应用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx list&lt;/code>&lt;/td>
&lt;td style="text-align: left">列出所有已安装的应用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx upgrade &amp;lt;pkg&amp;gt;&lt;/code>&lt;/td>
&lt;td style="text-align: left">升级一个已安装的应用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx upgrade-all&lt;/code>&lt;/td>
&lt;td style="text-align: left">升级所有已安装的应用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx reinstall &amp;lt;pkg&amp;gt;&lt;/code>&lt;/td>
&lt;td style="text-align: left">重新安装一个应用 (使用与之前相同的 Python 版本)。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx reinstall-all&lt;/code>&lt;/td>
&lt;td style="text-align: left">重新安装所有应用。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx inject &amp;lt;pkg&amp;gt; [deps...]&lt;/code>&lt;/td>
&lt;td style="text-align: left">将额外的包注入到已安装应用的环境中。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx ensurepath&lt;/code>&lt;/td>
&lt;td style="text-align: left">确保 &lt;code>pipx&lt;/code> 的可执行文件路径 (通常是 &lt;code>~/.local/bin&lt;/code>) 在你的 PATH 中。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx completions&lt;/code>&lt;/td>
&lt;td style="text-align: left">为你的 shell 生成自动补全脚本。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx --version&lt;/code>&lt;/td>
&lt;td style="text-align: left">显示 &lt;code>pipx&lt;/code> 的版本。&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;code>pipx &amp;lt;command&amp;gt; --help&lt;/code>&lt;/td>
&lt;td style="text-align: left">显示特定命令的帮助信息。&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="何时使用-pipx-vs-pip">&lt;strong>何时使用 &lt;code>pipx&lt;/code> vs &lt;code>pip&lt;/code>?&lt;/strong>
&lt;/h2>&lt;ul>
&lt;li>
&lt;p>&lt;strong>使用 &lt;code>pipx&lt;/code>：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>当你想要安装和运行一个主要作为&lt;strong>命令行工具/应用&lt;/strong>的 Python 包时 (例如 &lt;code>httpie&lt;/code>, &lt;code>black&lt;/code>, &lt;code>poetry&lt;/code>, &lt;code>ansible&lt;/code>, &lt;code>awscli&lt;/code> 等)。&lt;/li>
&lt;li>你希望这些工具全局可用，但又不想它们污染你的系统 Python 或其他项目的环境。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>使用 &lt;code>pip&lt;/code> (通常在虚拟环境中，如 &lt;code>venv&lt;/code>)：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>当你为一个特定的 Python &lt;strong>项目&lt;/strong>安装&lt;strong>库依赖&lt;/strong>时 (例如 &lt;code>requests&lt;/code>, &lt;code>numpy&lt;/code>, &lt;code>django&lt;/code> 等)。这些是你会在 Python 代码中 &lt;code>import&lt;/code> 的库。&lt;/li>
&lt;li>这些库是项目的一部分，而不是独立的命令行应用。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>希望这个教程能帮助你开始使用 &lt;code>pipx&lt;/code>！它是一个非常实用的工具，可以让你的 Python 应用管理更加清爽和高效。&lt;/p></description></item><item><title>包管理工具uv使用教程</title><link>https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post 包管理工具uv使用教程" />&lt;p>&lt;a class="link" href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"
>github地址&lt;/a>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>- &lt;a class="link" href="#uv%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4" >UV常用命令&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>- &lt;a class="link" href="#pyprojecttoml%e4%bd%bf%e7%94%a8" >pyproject.toml使用&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>- &lt;a class="link" href="#uv-tool%e7%9a%84%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" >uv tool 使用&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>错误解决&lt;/strong>&lt;/p>
&lt;p>-&lt;a class="link" href="#problem_with_the_package_or_the_build_environment" >uv sync报错：hint: This usually indicates a problem with the package or the build environment.&lt;/a>&lt;/p>
&lt;p>-[下载速度慢？使用 export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple 设置镜像源]&lt;/p>
&lt;hr>
&lt;h2 id="uv常用命令">uv常用命令
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 初始化一个新的 Python 项目 and 创建toml文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv init &amp;lt;project-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv venv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 激活虚拟环境（Unix/macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> .venv/bin/activate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 激活虚拟环境（Windows）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">.venv&lt;span class="se">\S&lt;/span>cripts&lt;span class="se">\a&lt;/span>ctivate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install &amp;lt;package-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装项目依赖（从 pyproject.toml 或 requirements.txt）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 升级包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install --upgrade &amp;lt;package-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 卸载包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip uninstall &amp;lt;package-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 列出已安装的包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 导出依赖到 requirements.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip freeze &amp;gt; requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 运行 Python 脚本或命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run &amp;lt;script.py&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run python &amp;lt;script.py&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加依赖到 pyproject.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add &amp;lt;package-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 移除依赖从 pyproject.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv remove &amp;lt;package-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 同步项目依赖（确保虚拟环境与 pyproject.toml 一致）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv sync &lt;span class="c1"># 如果只有requirements.txt使用uv sync --requirements requirements.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看依赖树&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tree
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv cache clean
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查 uv 版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>UV 是一个由 Astral (Ruff 的开发者) 开发的、用 Rust 编写的极速 Python 包安装器和解析器。它的目标是成为 &lt;code>pip&lt;/code> 和 &lt;code>venv&lt;/code> 的直接替代品，提供更快、更友好的用户体验。&lt;/p>
&lt;p>&lt;strong>教程大纲:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>UV 是什么？为什么选择 UV？&lt;/strong>&lt;/li>
&lt;li>&lt;strong>安装 UV&lt;/strong>&lt;/li>
&lt;li>&lt;strong>核心概念&lt;/strong>
&lt;ul>
&lt;li>虚拟环境管理&lt;/li>
&lt;li>包管理 (作为 &lt;code>pip&lt;/code> 的替代)&lt;/li>
&lt;li>依赖解析&lt;/li>
&lt;li>全局缓存&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>基本命令详解&lt;/strong>
&lt;ul>
&lt;li>创建和管理虚拟环境 (&lt;code>uv venv&lt;/code>)&lt;/li>
&lt;li>安装包 (&lt;code>uv pip install&lt;/code>)&lt;/li>
&lt;li>卸载包 (&lt;code>uv pip uninstall&lt;/code>)&lt;/li>
&lt;li>列出已安装的包 (&lt;code>uv pip list&lt;/code>)&lt;/li>
&lt;li>生成依赖文件 (&lt;code>uv pip freeze&lt;/code>)&lt;/li>
&lt;li>从依赖文件安装 (&lt;code>uv pip install -r&lt;/code>, &lt;code>uv pip sync&lt;/code>)&lt;/li>
&lt;li>编译依赖 (&lt;code>uv pip compile&lt;/code>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>高级用法和特性&lt;/strong>
&lt;ul>
&lt;li>使用 &lt;code>pyproject.toml&lt;/code>&lt;/li>
&lt;li>临时执行包 (&lt;code>uvx&lt;/code>)&lt;/li>
&lt;li>缓存管理 (&lt;code>uv cache&lt;/code>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>与 pip 的主要区别和优势&lt;/strong>&lt;/li>
&lt;li>&lt;strong>总结与展望&lt;/strong>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="基础知识">基础知识
&lt;/h2>&lt;h3 id="1-uv-是什么为什么选择-uv">1. UV 是什么？为什么选择 UV？
&lt;/h3>&lt;ul>
&lt;li>
&lt;p>&lt;strong>UV 是什么？&lt;/strong>
UV 是一个实验性的 Python 包管理工具，旨在提供一个非常快速的、统一的包安装和虚拟环境管理体验。它被设计为 &lt;code>pip&lt;/code>, &lt;code>pip-tools&lt;/code> (特别是 &lt;code>pip-compile&lt;/code>) 和 &lt;code>venv&lt;/code> 的替代品。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>为什么选择 UV？&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>速度极快:&lt;/strong> UV 使用 Rust 编写，并在依赖解析和包安装方面进行了大量优化，通常比 &lt;code>pip&lt;/code> 快几个数量级，尤其是在复杂的依赖关系或冷缓存启动时。&lt;/li>
&lt;li>&lt;strong>统一体验:&lt;/strong> 将虚拟环境创建 (&lt;code>venv&lt;/code>) 和包安装/管理 (&lt;code>pip&lt;/code>) 功能整合到单个命令行工具 &lt;code>uv&lt;/code> 中。&lt;/li>
&lt;li>&lt;strong>更好的依赖解析器:&lt;/strong> UV 内置了一个高性能的依赖解析器，可以更快、更准确地解决复杂的依赖冲突。&lt;/li>
&lt;li>&lt;strong>现代化的设计:&lt;/strong> 遵循最新的 Python 打包标准 (如 PEP 517, PEP 621)。&lt;/li>
&lt;li>&lt;strong>全局缓存:&lt;/strong> UV 使用一个共享的全局缓存来存储下载的包和构建的轮子 (wheels)，这使得在不同项目中重用依赖时速度更快，并节省磁盘空间。&lt;/li>
&lt;li>&lt;strong>&lt;code>pip-compile&lt;/code> 功能内置:&lt;/strong> &lt;code>uv pip compile&lt;/code> 命令提供了类似于 &lt;code>pip-tools&lt;/code> 的依赖锁定功能。&lt;/li>
&lt;li>&lt;strong>&lt;code>uvx&lt;/code>&lt;/strong>: 类似于 &lt;code>npx&lt;/code> (Node.js) 或 &lt;code>pipx run&lt;/code>，允许你临时执行来自 PyPI 的包，而无需将其安装到你的项目中或全局环境中。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="2-安装-uv">2. 安装 UV
&lt;/h3>&lt;ol>
&lt;li>在linux或者mac中安装
你可以通过多种方式安装 UV：&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>使用 &lt;code>curl&lt;/code> (Linux &amp;amp; macOS):&lt;/strong>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -LsSf https://astral.sh/uv/install.sh &lt;span class="p">|&lt;/span> sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>使用 &lt;code>pip&lt;/code> (不推荐用于全局安装，除非在隔离环境中):&lt;/strong>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install uv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>使用 &lt;code>pipx&lt;/code> (推荐，用于将 UV 安装到隔离环境中):&lt;/strong>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pipx install uv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>如果你没有 &lt;code>pipx&lt;/code>, 可以先安装它: &lt;code>pip install pipx&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image.png"
width="1166"
height="1294"
srcset="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu11805285142148843573.png 480w, https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu6727350651767616734.png 1024w"
loading="lazy"
alt="安装pipx"
class="gallery-image"
data-flex-grow="90"
data-flex-basis="216px"
>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>使用 &lt;code>cargo&lt;/code> (如果你是 Rust 开发者):&lt;/strong>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cargo install uv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>在windows中安装&lt;/li>
&lt;/ol>
&lt;p>&lt;a class="link" href="https://www.cnblogs.com/haima/p/18928947" target="_blank" rel="noopener"
>安装教程&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>从 GitHub Releases 下载预编译的二进制文件。&lt;/strong>
&lt;a class="link" href="https://github.com/astral-sh/uv/releases" target="_blank" rel="noopener"
>下载地址&lt;/a>
&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2.png"
width="953"
height="673"
srcset="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2_hu5512137275790468630.png 480w, https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-2_hu4907545491651743800.png 1024w"
loading="lazy"
alt="选择x64文件"
class="gallery-image"
data-flex-grow="141"
data-flex-basis="339px"
>
&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3.png"
width="665"
height="409"
srcset="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3_hu2074100290704322314.png 480w, https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-3_hu5947836800117065490.png 1024w"
loading="lazy"
alt="解压之后是这三个文件"
class="gallery-image"
data-flex-grow="162"
data-flex-basis="390px"
>
&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-4.png"
width="1106"
height="777"
srcset="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-4_hu645362074467156884.png 480w, https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-4_hu11540035120069465804.png 1024w"
loading="lazy"
alt="移动到自己的目录，然后添加环境变量"
class="gallery-image"
data-flex-grow="142"
data-flex-basis="341px"
>&lt;/li>
&lt;/ul>
&lt;p>安装完成后，验证安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;em>注意：如果你发现安装好之后，vscode/cursor中的terminal并没有生效，那么需要完全重启vscode/cursor&lt;/em>&lt;/p>
&lt;hr>
&lt;h3 id="3-核心概念">3. 核心概念
&lt;/h3>&lt;ul>
&lt;li>
&lt;p>&lt;strong>虚拟环境管理:&lt;/strong>
UV 可以像 &lt;code>python -m venv&lt;/code> 或 &lt;code>virtualenv&lt;/code> 一样创建和管理虚拟环境。它会将环境创建在 &lt;code>.venv&lt;/code> 目录（默认）或你指定的目录。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>包管理 (作为 &lt;code>pip&lt;/code> 的替代):&lt;/strong>
&lt;code>uv pip&lt;/code> 子命令旨在成为 &lt;code>pip&lt;/code> 命令的直接替代品。大多数你熟悉的 &lt;code>pip&lt;/code> 命令都可以用 &lt;code>uv pip&lt;/code> 替代，例如 &lt;code>uv pip install &amp;lt;package&amp;gt;&lt;/code>, &lt;code>uv pip uninstall &amp;lt;package&amp;gt;&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>依赖解析:&lt;/strong>
UV 的核心优势之一是其快速且健壮的依赖解析器。当你安装包或编译需求文件时，它会分析所有直接和间接的依赖关系，找到一组兼容的版本。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>全局缓存:&lt;/strong>
UV 会在用户缓存目录（例如 &lt;code>~/.cache/uv&lt;/code> 或 &lt;code>%LOCALAPPDATA%\uv\cache&lt;/code>）中维护一个全局缓存。这包括下载的包索引、sdist、wheel 文件等。这意味着如果你在项目 A 中安装了 &lt;code>requests==2.30.0&lt;/code>，在项目 B 中再次安装相同版本的 &lt;code>requests&lt;/code> 时，UV 可以直接从缓存中获取，无需重新下载或构建。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="4-基本命令详解">4. 基本命令详解
&lt;/h3>&lt;h4 id="创建和管理虚拟环境-uv-venv">创建和管理虚拟环境 (&lt;code>uv venv&lt;/code>)
&lt;/h4>&lt;ul>
&lt;li>
&lt;p>&lt;strong>创建虚拟环境:&lt;/strong>
默认情况下，会在当前目录下创建一个名为 &lt;code>.venv&lt;/code> 的虚拟环境。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv venv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1.png"
width="1966"
height="324"
srcset="https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu12025158592602192423.png 480w, https://www.zata.cc/p/%E5%8C%85%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7uv%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image-1_hu3328339212780258102.png 1024w"
loading="lazy"
alt="uv venv"
class="gallery-image"
data-flex-grow="606"
data-flex-basis="1456px"
>
你也可以指定环境名称和 Python解释器：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv venv myenv --python 3.11 &lt;span class="c1"># 使用 python3.11 创建名为 myenv 的环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv venv .env -p 3.9 &lt;span class="c1"># 使用 python3.9 创建名为 .env 的环境&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>激活虚拟环境:&lt;/strong>
UV 创建的虚拟环境与标准 &lt;code>venv&lt;/code> 模块创建的环境结构相同，激活方式也一样：&lt;/p>
&lt;ul>
&lt;li>Linux/macOS:
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> .venv/bin/activate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或 source myenv/bin/activate&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Windows (CMD):
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">.venv&lt;span class="se">\S&lt;/span>cripts&lt;span class="se">\a&lt;/span>ctivate.bat
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Windows (PowerShell):
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">.venv&lt;span class="se">\S&lt;/span>cripts&lt;span class="se">\A&lt;/span>ctivate.ps1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>激活后，命令行提示符通常会显示虚拟环境的名称。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>停用虚拟环境:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">deactivate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="安装包-uv-pip-install">安装包 (&lt;code>uv pip install&lt;/code>)
&lt;/h4>&lt;ul>
&lt;li>
&lt;p>&lt;strong>从 PyPI 安装最新版本:&lt;/strong>
(确保你已激活虚拟环境，或者 UV 会尝试安装到全局环境，除非配置了 &lt;code>UV_SYSTEM_PYTHON=true&lt;/code> 来明确允许)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install requests
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install flask sqlalchemy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>安装特定版本:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install &lt;span class="s2">&amp;#34;requests==2.28.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install &lt;span class="s2">&amp;#34;django&amp;gt;=3.2,&amp;lt;4.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>从 &lt;code>requirements.txt&lt;/code> 文件安装:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>从本地项目安装 (使用 &lt;code>pyproject.toml&lt;/code> 或 &lt;code>setup.py&lt;/code>):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install . &lt;span class="c1"># 安装当前目录下的项目&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install -e . &lt;span class="c1"># 以可编辑模式安装&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>从 Git 仓库安装:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install git+https://github.com/pallets/flask.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>指定索引 URL:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install --index-url https://my-private-index/simple requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="卸载包-uv-pip-uninstall">卸载包 (&lt;code>uv pip uninstall&lt;/code>)
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip uninstall requests
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip uninstall requests flask
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以配合 &lt;code>-r requirements.txt&lt;/code> 使用，卸载文件中列出的所有包。&lt;/p>
&lt;h4 id="列出已安装的包-uv-pip-list">列出已安装的包 (&lt;code>uv pip list&lt;/code>)
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip list
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip list --format freeze &lt;span class="c1"># 输出格式与 requirements.txt 相同&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip list --format json &lt;span class="c1"># 输出为 JSON 格式&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="生成依赖文件-uv-pip-freeze">生成依赖文件 (&lt;code>uv pip freeze&lt;/code>)
&lt;/h4>&lt;p>这会将当前环境中所有已安装的包及其版本输出到标准输出，通常用于生成 &lt;code>requirements.txt&lt;/code> 文件。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip freeze &amp;gt; requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="从依赖文件安装-uv-pip-install--r-uv-pip-sync">从依赖文件安装 (&lt;code>uv pip install -r&lt;/code>, &lt;code>uv pip sync&lt;/code>)
&lt;/h4>&lt;ul>
&lt;li>
&lt;p>&lt;code>uv pip install -r requirements.txt&lt;/code>:
安装 &lt;code>requirements.txt&lt;/code> 中列出的所有包。如果某些包已安装但版本不匹配，UV 会尝试升级或降级。如果某些包已安装但不在文件中，它们不会被卸载。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>uv pip sync requirements.txt&lt;/code>:
&lt;strong>推荐使用 &lt;code>sync&lt;/code> 来精确同步环境。&lt;/strong> 此命令会确保你的虚拟环境与 &lt;code>requirements.txt&lt;/code> 文件中的内容 &lt;em>完全一致&lt;/em>。&lt;/p>
&lt;ul>
&lt;li>安装文件中列出的、但尚未安装的包。&lt;/li>
&lt;li>升级或降级已安装的、但版本与文件中不符的包。&lt;/li>
&lt;li>&lt;strong>卸载环境中已安装的、但未在文件中列出的包。&lt;/strong>
这对于确保环境的纯净和可复现性非常有用。&lt;/li>
&lt;/ul>
&lt;p>如果你也使用 &lt;code>pyproject.toml&lt;/code> (见下文)，你可以同步项目的依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip sync pyproject.toml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或 uv pip sync (如果 pyproject.toml 在当前目录)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h4 id="编译依赖-uv-pip-compile">编译依赖 (&lt;code>uv pip compile&lt;/code>)
&lt;/h4>&lt;p>类似于 &lt;code>pip-compile&lt;/code> (来自 &lt;code>pip-tools&lt;/code>)，此命令用于将高层级的依赖需求（例如 &lt;code>requirements.in&lt;/code> 或 &lt;code>pyproject.toml&lt;/code>）解析并锁定为具体的版本，输出到一个完全固定的依赖文件（例如 &lt;code>requirements.txt&lt;/code>）。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>从 &lt;code>requirements.in&lt;/code> 编译到 &lt;code>requirements.txt&lt;/code>:&lt;/strong>
&lt;code>requirements.in&lt;/code> (示例):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">flask
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">requests&amp;gt;=2.20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>编译命令:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip compile requirements.in -o requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会生成一个 &lt;code>requirements.txt&lt;/code> 文件，其中包含 Flask、Requests 以及它们所有子依赖的精确版本。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>从 &lt;code>pyproject.toml&lt;/code> 编译:&lt;/strong>
如果你的项目使用 &lt;code>pyproject.toml&lt;/code> 定义依赖：
&lt;code>pyproject.toml&lt;/code> (部分示例):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">project&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;my-app&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">version&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;0.1.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dependencies&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;flask&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;requests&amp;gt;=2.20&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">project&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">optional-dependencies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dev&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pytest&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;black&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>编译命令:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编译核心依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip compile pyproject.toml -o requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编译核心依赖和 &amp;#39;dev&amp;#39; 附加依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip compile pyproject.toml --extra dev -o requirements-dev.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="pyprojecttoml使用">pyproject.toml使用
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Initialize a new project with pyproject.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv init &amp;lt;project-name&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add a dependency to pyproject.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Remove a dependency from pyproject.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv remove &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Sync dependencies from pyproject.toml to virtual environment&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv sync
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Update dependencies and lockfile&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv lock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Run a script or command in the project environment&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run &amp;lt;script-or-command&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Display dependency tree&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tree
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Add a development dependency&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add --dev &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Create or update uv.lock file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv lock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Build a source distribution or wheel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Publish the project to a package index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv publish
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Export dependencies to requirements.txt&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv &lt;span class="nb">export&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Check or manage Python version&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv python
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 Python 项目中使用 &lt;code>uv&lt;/code> 包管理工具时，&lt;code>pyproject.toml&lt;/code> 是其核心配置文件，用于定义项目元数据、依赖关系和构建配置。以下是关于如何使用 &lt;code>uv&lt;/code> 的 &lt;code>pyproject.toml&lt;/code> 文件的详细说明：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>基本结构&lt;/strong>
&lt;code>pyproject.toml&lt;/code> 文件基于 TOML 格式，&lt;code>uv&lt;/code> 使用它来管理项目的依赖、元数据和构建配置。以下是一个典型的 &lt;code>pyproject.toml&lt;/code> 文件结构：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">project&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;my-project&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">version&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;0.1.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;A sample Python project&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">readme&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;README.md&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">requires-python&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;gt;=3.8&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dependencies&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;requests&amp;gt;=2.25.1&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pandas&amp;gt;=1.5.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">tool&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">uv&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">uv&lt;/span> &lt;span class="err">特定的配置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dev-dependencies&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pytest&amp;gt;=7.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;black&amp;gt;=23.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>关键字段说明&lt;/strong>
&lt;code>[project]&lt;/code> 部分
这是 PEP 621 标准定义的项目元数据部分，&lt;code>uv&lt;/code> 使用它来了解项目的基本信息和依赖。&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;code>name&lt;/code>: 项目名称，必须唯一。&lt;/li>
&lt;li>&lt;code>version&lt;/code>: 项目版本号，建议遵循语义化版本规范（Semantic Versioning）。&lt;/li>
&lt;li>&lt;code>description&lt;/code>: 项目简短描述。&lt;/li>
&lt;li>&lt;code>readme&lt;/code>: 项目 README 文件路径（用于生成项目描述）。&lt;/li>
&lt;li>&lt;code>requires-python&lt;/code>: 指定支持的 Python 版本（例如 &lt;code>&amp;gt;=3.8&lt;/code>）。&lt;/li>
&lt;li>&lt;code>dependencies&lt;/code>: 项目的生产依赖列表，格式为包名和版本约束。&lt;/li>
&lt;/ul>
&lt;p>&lt;code>[tool.uv]&lt;/code> 部分
这是 &lt;code>uv&lt;/code> 专用的配置部分，用于定义 &lt;code>uv&lt;/code> 特定的设置。&lt;/p>
&lt;ul>
&lt;li>&lt;code>dev-dependencies&lt;/code>: 开发环境依赖（如测试、格式化工具），与生产依赖分开管理。&lt;/li>
&lt;li>其他配置（可选）：
&lt;ul>
&lt;li>&lt;code>index-url&lt;/code>: 指定自定义的 PyPI 源，例如 &lt;code>&amp;quot;https://pypi.company.com/simple&amp;quot;&lt;/code>.&lt;/li>
&lt;li>&lt;code>extra-index-url&lt;/code>: 额外的 PyPI 源。&lt;/li>
&lt;li>&lt;code>constraint&lt;/code>: 指定依赖约束文件路径。&lt;/li>
&lt;li>&lt;code>override&lt;/code>: 指定依赖覆盖文件路径。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>&lt;strong>使用 &lt;code>uv&lt;/code> 管理 &lt;code>pyproject.toml&lt;/code>&lt;/strong>
以下是如何结合 &lt;code>uv&lt;/code> 命令和 &lt;code>pyproject.toml&lt;/code> 进行项目管理的常见操作：&lt;/li>
&lt;/ol>
&lt;p>初始化项目
运行以下命令，&lt;code>uv&lt;/code> 会自动创建一个基础的 &lt;code>pyproject.toml&lt;/code> 文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv init my-project
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会生成一个包含 &lt;code>[project]&lt;/code> 部分的 &lt;code>pyproject.toml&lt;/code>，你可以根据需要编辑。&lt;/p>
&lt;p>添加依赖&lt;/p>
&lt;ul>
&lt;li>添加生产依赖：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv add requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>这会在 &lt;code>pyproject.toml&lt;/code> 的 &lt;code>[project]&lt;/code> 部分添加 &lt;code>requests&lt;/code> 依赖。&lt;/li>
&lt;li>添加开发依赖：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv add --dev pytest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>这会在 &lt;code>[tool.uv]&lt;/code> 部分添加 &lt;code>pytest&lt;/code> 作为开发依赖。&lt;/li>
&lt;/ul>
&lt;p>移除依赖&lt;/p>
&lt;ul>
&lt;li>移除生产依赖：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv remove requests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>移除开发依赖：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv remove --dev pytest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>同步依赖
运行以下命令，确保虚拟环境中的依赖与 &lt;code>pyproject.toml&lt;/code> 一致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv sync
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会安装 &lt;code>[project.dependencies]&lt;/code> 和 &lt;code>[tool.uv.dev-dependencies]&lt;/code> 中的所有依赖。&lt;/p>
&lt;p>运行项目
使用 &lt;code>uv run&lt;/code> 执行脚本或命令，自动使用虚拟环境的依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv run python main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>锁定依赖
&lt;code>uv&lt;/code> 会生成一个 &lt;code>uv.lock&lt;/code> 文件，用于锁定依赖的确切版本，确保可重复构建：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv lock
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>uv.lock&lt;/code> 是自动生成的，不需要手动编辑。&lt;/p>
&lt;ol start="4">
&lt;li>&lt;strong>示例：完整的 &lt;code>pyproject.toml&lt;/code>&lt;/strong>
以下是一个更完整的示例，包含多种配置：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">project&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;my-project&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">version&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;0.2.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;A Python project managed by uv&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">authors&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;Your Name&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">email&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;your.email@example.com&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">license&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;MIT&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">requires-python&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;&amp;gt;=3.9&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dependencies&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;fastapi&amp;gt;=0.95.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;uvicorn&amp;gt;=0.20.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">tool&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">uv&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dev-dependencies&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pytest&amp;gt;=7.3.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;ruff&amp;gt;=0.1.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;mypy&amp;gt;=1.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">index-url&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;https://pypi.org/simple&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">extra-index-url&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;https://test.pypi.org/simple&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">build-system&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">requires&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;hatchling&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">build-backend&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;hatchling.build&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>&lt;strong>注意事项&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>版本约束&lt;/strong>：依赖版本使用 PEP 440 规范，例如 &lt;code>&amp;gt;=1.0.0,&amp;lt;2.0.0&lt;/code>。&lt;/li>
&lt;li>&lt;strong>虚拟环境&lt;/strong>：&lt;code>uv&lt;/code> 自动在项目目录下的 &lt;code>.venv&lt;/code> 创建虚拟环境，运行 &lt;code>uv sync&lt;/code> 即可激活。&lt;/li>
&lt;li>&lt;strong>兼容性&lt;/strong>：&lt;code>uv&lt;/code> 的 &lt;code>pyproject.toml&lt;/code> 遵循 PEP 621 标准，与其他工具（如 &lt;code>poetry&lt;/code>、&lt;code>pdm&lt;/code>）兼容，但 &lt;code>[tool.uv]&lt;/code> 是 &lt;code>uv&lt;/code> 专有。&lt;/li>
&lt;li>&lt;strong>锁定文件&lt;/strong>：&lt;code>uv.lock&lt;/code> 确保依赖版本一致，建议将其加入版本控制。&lt;/li>
&lt;li>&lt;strong>自定义源&lt;/strong>：如果使用私有 PyPI 源，确保在 &lt;code>[tool.uv]&lt;/code> 中正确配置 &lt;code>index-url&lt;/code> 或 &lt;code>extra-index-url&lt;/code>。&lt;/li>
&lt;/ul>
&lt;ol start="6">
&lt;li>&lt;strong>常见问题&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>&lt;strong>如何迁移现有项目到 &lt;code>uv&lt;/code>？&lt;/strong>
&lt;ol>
&lt;li>确保 &lt;code>pyproject.toml&lt;/code> 包含 &lt;code>[project]&lt;/code> 部分，列出依赖。&lt;/li>
&lt;li>运行 &lt;code>uv lock&lt;/code> 生成 &lt;code>uv.lock&lt;/code>。&lt;/li>
&lt;li>运行 &lt;code>uv sync&lt;/code> 安装依赖。&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>&lt;strong>如何处理依赖冲突？&lt;/strong>
使用 &lt;code>uv lock --verbose&lt;/code> 查看冲突详情，必要时在 &lt;code>[tool.uv]&lt;/code> 中添加 &lt;code>constraint&lt;/code> 文件。&lt;/li>
&lt;li>&lt;strong>如何运行特定命令？&lt;/strong>
使用 &lt;code>uv run&lt;/code> 执行命令，例如 &lt;code>uv run pytest tests/&lt;/code>。&lt;/li>
&lt;/ul>
&lt;ol start="7">
&lt;li>&lt;strong>更多资源&lt;/strong>&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>官方文档：访问 &lt;a class="link" href="https://docs.astral.sh/uv/" target="_blank" rel="noopener"
>uv 文档&lt;/a> 获取最新信息。&lt;/li>
&lt;li>示例项目：查看 &lt;code>uv&lt;/code> 的 GitHub 仓库或官方示例。&lt;/li>
&lt;li>如果需要实时搜索最新信息，可使用 &lt;code>uv&lt;/code> 的 X 社区或 PyPI 页面。&lt;/li>
&lt;/ul>
&lt;p>如果你有具体的 &lt;code>pyproject.toml&lt;/code> 配置问题或需要进一步示例，请提供更多细节，我可以为你定制解答！&lt;/p>
&lt;h4 id="uv-tool的使用方法">uv tool的使用方法
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装命令行工具到持久化环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install &amp;lt;package&amp;gt; &lt;span class="c1"># 安装指定包的工具（如 ruff）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install &amp;lt;package&amp;gt;&lt;span class="o">==&lt;/span>&amp;lt;version&amp;gt; &lt;span class="c1"># 安装特定版本的工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install &amp;lt;package&amp;gt; --with &amp;lt;dep&amp;gt; &lt;span class="c1"># 安装工具并附带额外依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install &amp;lt;package&amp;gt; --python &amp;lt;version&amp;gt; &lt;span class="c1"># 使用指定 Python 版本安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install -e . &lt;span class="c1"># 以 editable 模式安装当前目录项目（开发 CLI 工具时常用）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install -e . --force &lt;span class="c1"># 强制重新安装当前目录 editable 项目&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在临时环境中运行工具（别名 uvx）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx &amp;lt;command&amp;gt; &lt;span class="c1"># 运行工具（如 uvx pycowsay &amp;#39;hello&amp;#39;）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx &amp;lt;command&amp;gt;@&amp;lt;version&amp;gt; &lt;span class="c1"># 运行特定版本的工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx --from &amp;lt;package&amp;gt; &amp;lt;command&amp;gt; &lt;span class="c1"># 指定提供命令的包（如 uvx --from httpie http）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx --python &amp;lt;version&amp;gt; &amp;lt;command&amp;gt; &lt;span class="c1"># 使用指定 Python 版本运行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 升级已安装的工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool upgrade &amp;lt;package&amp;gt; &lt;span class="c1"># 升级工具到最新版本（尊重版本约束）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 列出已安装的工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool list &lt;span class="c1"># 显示所有通过 uv tool install 安装的工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 卸载工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool uninstall &amp;lt;package&amp;gt; &lt;span class="c1"># 移除指定工具及其环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 更新 shell 配置以确保工具可执行文件在 PATH 中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool update-shell &lt;span class="c1"># 添加 ~/.local/bin 到 PATH&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以下是关于 Python 包管理工具 &lt;strong>uv&lt;/strong> 中 &lt;code>tool&lt;/code> 功能的详细使用教程，基于官方文档和相关资料整理，涵盖安装、运行、管理工具等核心操作，并提供示例以便于理解。&lt;a class="link" href="https://docs.astral.sh/uv/getting-started/installation/" target="_blank" rel="noopener"
>&lt;/a>&lt;a class="link" href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"
>&lt;/a>&lt;a class="link" href="https://medium.com/%40nimritakoul01/uv-package-manager-for-python-f92c5a760a1c" target="_blank" rel="noopener"
>&lt;/a>&lt;/p>
&lt;hr>
&lt;p>什么是 uv 的 &lt;code>tool&lt;/code> 功能？&lt;/p>
&lt;p>&lt;code>uv&lt;/code> 的 &lt;code>tool&lt;/code> 功能允许用户安装和运行 Python 包提供的命令行工具（类似 &lt;code>pipx&lt;/code>），并在隔离的环境中执行这些工具。它特别适合需要快速运行 CLI 工具（如 &lt;code>ruff&lt;/code>、&lt;code>pytest&lt;/code> 或 &lt;code>huggingface-cli&lt;/code>）的场景。&lt;code>uv tool&lt;/code> 提供了以下优势：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>隔离性&lt;/strong>：工具运行在独立的虚拟环境中，避免与项目依赖冲突。&lt;/li>
&lt;li>&lt;strong>高效性&lt;/strong>：利用 &lt;code>uv&lt;/code> 的高速缓存和 Rust 实现，安装和运行工具极快。&lt;/li>
&lt;li>&lt;strong>兼容性&lt;/strong>：支持 &lt;code>pip&lt;/code> 生态系统，易于迁移和使用。&lt;/li>
&lt;/ul>
&lt;p>&lt;code>uv tool&lt;/code> 主要命令包括：&lt;/p>
&lt;ul>
&lt;li>&lt;code>uv tool install&lt;/code>：安装工具及其依赖。&lt;/li>
&lt;li>&lt;code>uv tool run&lt;/code>（别名 &lt;code>uvx&lt;/code>）：在临时环境中运行工具。&lt;/li>
&lt;li>&lt;code>uv tool upgrade&lt;/code>：升级已安装的工具。&lt;/li>
&lt;li>&lt;code>uv tool list&lt;/code>：列出已安装的工具。&lt;/li>
&lt;li>&lt;code>uv tool uninstall&lt;/code>：卸载工具。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>使用 uv tool 的教程&lt;/p>
&lt;p>以下是 &lt;code>uv tool&lt;/code> 的核心功能和使用步骤，包含具体命令和示例。&lt;/p>
&lt;ol>
&lt;li>安装命令行工具 (&lt;code>uv tool install&lt;/code>)&lt;/li>
&lt;/ol>
&lt;p>使用 &lt;code>uv tool install&lt;/code> 将一个 Python 包提供的命令行工具安装到持久化环境中，工具的可执行文件会自动添加到 &lt;code>PATH&lt;/code> 中。&lt;/p>
&lt;p>&lt;strong>语法&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install &amp;lt;package&amp;gt; &lt;span class="o">[&lt;/span>options&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>常用选项&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>--with &amp;lt;package&amp;gt;&lt;/code>：安装额外的依赖包。&lt;/li>
&lt;li>&lt;code>--python &amp;lt;version&amp;gt;&lt;/code>：指定 Python 版本。&lt;/li>
&lt;li>&lt;code>--force&lt;/code>：强制重新安装。&lt;/li>
&lt;li>&lt;code>--from &amp;lt;package&amp;gt;&lt;/code>：指定工具来源包（当包名和工具名不同时）。&lt;/li>
&lt;li>&lt;code>-e, --editable&lt;/code>：以可编辑模式安装本地项目，开发 CLI 工具时无需重复安装即可生效代码改动。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>示例 1：安装 ruff 工具&lt;/strong>
&lt;code>ruff&lt;/code> 是一个快速的 Python 代码检查工具。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install ruff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>安装后，运行以下命令验证：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ruff --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>输出示例：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ruff 0.5.4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>示例 2：安装 huggingface-cli 工具&lt;/strong>
&lt;code>huggingface_hub&lt;/code> 包提供了 &lt;code>huggingface-cli&lt;/code> 工具，用于与 Hugging Face 仓库交互。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install huggingface_hub
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>运行工具：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">huggingface-cli --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>示例 3：安装特定版本的工具&lt;/strong>
安装特定版本的 &lt;code>ruff&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install &lt;span class="s1">&amp;#39;ruff==0.5.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例 4：安装带有额外依赖的工具&lt;/strong>
安装 &lt;code>mkdocs&lt;/code> 并附带 &lt;code>mkdocs-material&lt;/code> 主题：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install mkdocs --with mkdocs-material
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例 5：以 editable 模式安装本地项目（开发 CLI 工具）&lt;/strong>
如果你正在开发一个包含 &lt;code>[project.scripts]&lt;/code> 入口点的 Python 包，可以用 editable 模式将其安装为命令行工具：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install -e .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>这样安装后，修改源码无需重新安装即可生效。&lt;/li>
&lt;li>配合 &lt;code>--force&lt;/code> 可在源码结构或入口点变更时强制刷新：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install --editable --force .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>注意&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>安装的工具可执行文件默认位于 &lt;code>~/.local/bin/&lt;/code>（Linux/macOS）或 &lt;code>%USERPROFILE%\.local\bin&lt;/code>（Windows）。确保该路径在 &lt;code>PATH&lt;/code> 中。&lt;/li>
&lt;li>如果工具未自动添加到 &lt;code>PATH&lt;/code>，运行以下命令更新 shell 配置：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool update-shell
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>运行工具 (&lt;code>uv tool run&lt;/code> / &lt;code>uvx&lt;/code>)&lt;/li>
&lt;/ol>
&lt;p>使用 &lt;code>uv tool run&lt;/code>（或其别名 &lt;code>uvx&lt;/code>）可以在临时虚拟环境中运行工具，无需持久化安装。适合一次性使用或测试。&lt;/p>
&lt;p>&lt;strong>语法&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx &amp;lt;command&amp;gt; &lt;span class="o">[&lt;/span>args&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 或
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool run &amp;lt;command&amp;gt; &lt;span class="o">[&lt;/span>args&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>常用选项&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>--from &amp;lt;package&amp;gt;&lt;/code>：指定提供命令的包（当包名和命令名不同时）。&lt;/li>
&lt;li>&lt;code>--python &amp;lt;version&amp;gt;&lt;/code>：指定 Python 版本。&lt;/li>
&lt;li>&lt;code>@&amp;lt;version&amp;gt;&lt;/code>：运行特定版本的工具。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>示例 1：运行 pycowsay&lt;/strong>
运行 &lt;code>pycowsay&lt;/code> 工具生成 ASCII 艺术：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx pycowsay &lt;span class="s1">&amp;#39;hello world!&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> ------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;lt; hello world! &amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ^__^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (oo)\_______
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (__)\ )\/\
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ||----w |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> || ||
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例 2：运行特定包的工具&lt;/strong>
&lt;code>httpie&lt;/code> 包提供 &lt;code>http&lt;/code> 命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx --from httpie http https://example.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例 3：运行特定版本的工具&lt;/strong>
运行 &lt;code>ruff&lt;/code> 的 0.3.0 版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx ruff@0.3.0 check
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例 4：指定 Python 版本&lt;/strong>
使用 Python 3.12 运行 &lt;code>ruff&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx --python 3.12 ruff --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>注意&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>uvx&lt;/code> 运行的工具在命令执行后，临时环境会被销毁。&lt;/li>
&lt;li>如果工具需要频繁使用，建议用 &lt;code>uv tool install&lt;/code> 安装到持久化环境。&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>升级工具 (&lt;code>uv tool upgrade&lt;/code>)&lt;/li>
&lt;/ol>
&lt;p>升级已安装的工具到最新版本，尊重安装时的版本约束。&lt;/p>
&lt;p>&lt;strong>语法&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool upgrade &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例：升级 ruff&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool upgrade ruff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>如果安装时指定了版本范围（如 &lt;code>ruff&amp;gt;=0.3,&amp;lt;0.4&lt;/code>），升级将保持在该范围内。&lt;/li>
&lt;li>要更改版本约束，重新运行 &lt;code>uv tool install&lt;/code>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install &lt;span class="s1">&amp;#39;ruff&amp;gt;=0.4&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>列出已安装工具 (&lt;code>uv tool list&lt;/code>)&lt;/li>
&lt;/ol>
&lt;p>查看所有通过 &lt;code>uv tool install&lt;/code> 安装的工具。&lt;/p>
&lt;p>&lt;strong>语法&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>输出示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ruff (0.5.4)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">huggingface-cli (0.23.0)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="5">
&lt;li>卸载工具 (&lt;code>uv tool uninstall&lt;/code>)&lt;/li>
&lt;/ol>
&lt;p>移除已安装的工具及其环境。&lt;/p>
&lt;p>&lt;strong>语法&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool uninstall &amp;lt;package&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>示例：卸载 ruff&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool uninstall ruff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="6">
&lt;li>管理工具依赖&lt;/li>
&lt;/ol>
&lt;p>&lt;code>uv tool&lt;/code> 安装的工具不会将其模块暴露给当前 Python 环境，以避免冲突。例如，安装 &lt;code>ruff&lt;/code> 后，以下命令会失败：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python -c &lt;span class="s2">&amp;#34;import ruff&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是设计使然，确保工具的依赖与项目隔离。&lt;/p>
&lt;p>如果需要将工具的模块用于项目，改用 &lt;code>uv add&lt;/code> 或 &lt;code>uv pip install&lt;/code> 将包安装到项目环境中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv add ruff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="7">
&lt;li>高级用法：结合 pyproject.toml&lt;/li>
&lt;/ol>
&lt;p>对于项目管理，&lt;code>uv&lt;/code> 支持在 &lt;code>pyproject.toml&lt;/code> 中定义工具依赖组。例如，添加 &lt;code>pytest&lt;/code> 到开发依赖组：&lt;/p>
&lt;p>&lt;strong>编辑 pyproject.toml&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">project&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;my-project&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">version&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;0.1.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dependencies&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;fastapi&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">dependency-groups&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">dev&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;pytest&amp;gt;=8.3.4&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">lint&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;ruff&amp;gt;=0.5.4&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>安装依赖&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv sync --group dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>运行 &lt;code>pytest&lt;/code>：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv run pytest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>运行 lint 工具&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv run ruff check
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="8">
&lt;li>常见问题与解决方案&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>问题&lt;/strong>：工具命令未找到。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>解决&lt;/strong>：确保 &lt;code>~/.local/bin&lt;/code> 在 &lt;code>PATH&lt;/code> 中，运行 &lt;code>uv tool update-shell&lt;/code> 或手动添加：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">PATH&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="s2">/.local/bin:&lt;/span>&lt;span class="nv">$PATH&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>问题&lt;/strong>：工具运行时依赖冲突。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>解决&lt;/strong>：使用 &lt;code>uvx&lt;/code> 在临时环境中运行，或检查 &lt;code>pyproject.toml&lt;/code> 中的依赖版本。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>问题&lt;/strong>：需要特定 Python 版本。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>解决&lt;/strong>：使用 &lt;code>uv python install&lt;/code> 安装所需版本：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv python install 3.11
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx --python 3.11 &amp;lt;command&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>最佳实践&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>优先使用 &lt;code>uvx&lt;/code> 进行测试&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>对于不常使用的工具，使用 &lt;code>uvx&lt;/code> 避免占用磁盘空间。&lt;/li>
&lt;li>示例：&lt;code>uvx black --version&lt;/code> 检查 &lt;code>black&lt;/code> 版本。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>持久化常用工具&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>使用 &lt;code>uv tool install&lt;/code> 安装频繁使用的工具（如 &lt;code>ruff&lt;/code>、&lt;code>pytest&lt;/code>），并确保 &lt;code>PATH&lt;/code> 配置正确。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>结合 CI/CD&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>在 CI/CD 管道中，使用 &lt;code>uv tool install&lt;/code> 安装工具，确保一致性。例如：
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install ruff
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ruff check .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>保持版本一致&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>使用 &lt;code>uv.lock&lt;/code> 和 &lt;code>pyproject.toml&lt;/code> 锁定工具版本，确保团队成员和生产环境使用相同版本。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>定期清理&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>使用 &lt;code>uv tool list&lt;/code> 检查已安装工具，&lt;code>uv tool uninstall&lt;/code> 移除不再需要的工具。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>示例工作流：设置开发环境&lt;/p>
&lt;p>假设你要为一个 FastAPI 项目设置 &lt;code>ruff&lt;/code>（代码检查）和 &lt;code>pytest&lt;/code>（测试）工具：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>初始化项目：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv init my-project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> my-project
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>添加项目依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv add fastapi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>添加开发工具：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv add --group dev pytest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv add --group lint ruff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>安装工具：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool install ruff
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv tool install pytest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>运行检查和测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ruff check .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run pytest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>检查工具：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv tool list
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>局限性&lt;/p>
&lt;ul>
&lt;li>&lt;strong>不完全兼容 &lt;code>pip&lt;/code>&lt;/strong>：某些 &lt;code>pip&lt;/code> 功能（如 &lt;code>.egg&lt;/code> 依赖、特定 Git 安装）暂不支持。查看 &lt;a class="link" href="https://docs.astral.sh/uv/pip/compatibility/" target="_blank" rel="noopener"
>pip 兼容性指南&lt;/a> 获取详情。&lt;a class="link" href="https://codemaker2016.medium.com/introducing-uv-next-gen-python-package-manager-b78ad39c95d7" target="_blank" rel="noopener"
>&lt;/a>&lt;/li>
&lt;li>&lt;strong>早期开发阶段&lt;/strong>：部分功能可能不稳定，建议关注 &lt;a class="link" href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"
>GitHub Issues&lt;/a> 获取最新更新。&lt;a class="link" href="https://ubuntushell.com/install-uv-python-package-manager/" target="_blank" rel="noopener"
>&lt;/a>&lt;/li>
&lt;li>&lt;strong>工具隔离&lt;/strong>：&lt;code>uv tool install&lt;/code> 的模块不可导入到项目中，需单独安装依赖。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>参考资料&lt;/p>
&lt;ul>
&lt;li>官方文档：https://docs.astral.sh/uv/guides/tools/&lt;a class="link" href="https://docs.astral.sh/uv/" target="_blank" rel="noopener"
>&lt;/a>&lt;/li>
&lt;li>GitHub 仓库：https://github.com/astral-sh/uv&lt;a class="link" href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"
>&lt;/a>&lt;/li>
&lt;li>UV 工具介绍：https://www.saaspegasus.com/guides/uv-python-package-manager/&lt;a class="link" href="https://www.saaspegasus.com/guides/uv-deep-dive/" target="_blank" rel="noopener"
>&lt;/a>&lt;/li>
&lt;li>示例教程：https://realpython.com/python-uv/&lt;a class="link" href="https://realpython.com/python-uv/" target="_blank" rel="noopener"
>&lt;/a>&lt;/li>
&lt;/ul>
&lt;h4 id="与-jupyter-notebook--jupyterlab-集成">与 Jupyter Notebook / JupyterLab 集成
&lt;/h4>&lt;h5 id="42-设置步骤">4.2 设置步骤
&lt;/h5>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4.2.1 创建并激活项目的 uv 虚拟环境 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv venv .venv &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">source&lt;/span> .venv/bin/activate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4.2.2 在 uv 环境中安装 Jupyter 和 ipykernel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv pip install jupyterlab ipykernel &lt;span class="o">(&lt;/span>或 notebook ipykernel&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#建议将这些作为开发依赖添加到 pyproject.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4.2.3 (推荐) 将 uv 环境注册为 Jupyter 内核 (Kernel) &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uv run python -m ipykernel install --user --name&lt;span class="o">=&lt;/span>my-project-venv --display-name&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Python (my-project-venv)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4.2.4 启动 JupyterLab 或 Jupyter Notebook &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">从已激活 uv 环境的终端启动：uv run jupyter lab 或 uv run jupyter notebook
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">或者全局安装的 Jupyter 自动检测到注册的内核
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4.2.5 在 Jupyter 中选择和使用 uv 环境的内核&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h5 id="43-管理项目依赖">4.3 管理项目依赖
&lt;/h5>&lt;p>在 Notebook 中通过 !uv pip install &amp;lt;new_package&amp;gt; (不推荐长期做法)&lt;/p>
&lt;p>正确做法：在终端中激活 uv 环境，使用 uv pip install，然后重启 Jupyter 内核&lt;/p>
&lt;p>使用 pyproject.toml 和 uv pip compile / uv pip sync 管理 Jupyter 项目的依赖&lt;/p>
&lt;h5 id="44-移除-jupyter-内核-如果已注册">4.4 移除 Jupyter 内核 (如果已注册)
&lt;/h5>&lt;p>jupyter kernelspec list&lt;/p>
&lt;p>jupyter kernelspec uninstall my-project-venv&lt;/p>
&lt;h3 id="5-高级用法和特性">5. 高级用法和特性
&lt;/h3>&lt;h4 id="使用-pyprojecttoml">使用 &lt;code>pyproject.toml&lt;/code>
&lt;/h4>&lt;p>UV 对 PEP 621 (&lt;code>pyproject.toml&lt;/code> 中的 &lt;code>[project]&lt;/code> 表) 有良好支持。&lt;/p>
&lt;ul>
&lt;li>&lt;code>uv pip install .&lt;/code>: 会读取 &lt;code>pyproject.toml&lt;/code> 中的 &lt;code>dependencies&lt;/code>。&lt;/li>
&lt;li>&lt;code>uv pip install .[extra]&lt;/code>: 会安装核心依赖和指定的 &lt;code>optional-dependencies&lt;/code>。&lt;/li>
&lt;li>&lt;code>uv pip sync pyproject.toml&lt;/code>: 会同步环境以匹配 &lt;code>pyproject.toml&lt;/code> 中定义的核心依赖。&lt;/li>
&lt;li>&lt;code>uv pip sync pyproject.toml --extra dev&lt;/code>: 同步核心依赖和 &lt;code>dev&lt;/code> 附加依赖。&lt;/li>
&lt;li>&lt;code>uv pip compile pyproject.toml&lt;/code>: 将 &lt;code>pyproject.toml&lt;/code> 中的依赖编译成锁文件。&lt;/li>
&lt;/ul>
&lt;h4 id="临时执行包-uvx">临时执行包 (&lt;code>uvx&lt;/code>)
&lt;/h4>&lt;p>&lt;code>uvx&lt;/code> 允许你执行来自 PyPI 的命令行工具，而无需将其永久安装到你的项目虚拟环境或全局 Python 环境中。UV 会在后台创建一个临时的隔离环境来运行该工具。&lt;/p>
&lt;p>这对于代码格式化器、linter 或一次性脚本非常有用。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uvx black . &lt;span class="c1"># 临时下载 black 并用它格式化当前目录代码&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx cowsay &lt;span class="s2">&amp;#34;Hello UV&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uvx python -m http.server &lt;span class="c1"># 临时运行一个 http 服务器&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>uvx&lt;/code> 会缓存下载的包，所以后续执行会更快。&lt;/p>
&lt;h4 id="缓存管理-uv-cache">缓存管理 (&lt;code>uv cache&lt;/code>)
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>查看缓存目录:&lt;/strong>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv cache dir
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>&lt;strong>清理缓存:&lt;/strong>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv cache clean
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或者 uv cache prune (更推荐，会保留最近使用的条目)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>清理缓存可以释放磁盘空间，但下次安装包时可能需要重新下载。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="6-与-pip-的主要区别和优势">6. 与 pip 的主要区别和优势
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align: left">特性&lt;/th>
&lt;th style="text-align: left">UV&lt;/th>
&lt;th style="text-align: left">pip + venv + pip-tools&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>核心语言&lt;/strong>&lt;/td>
&lt;td style="text-align: left">Rust&lt;/td>
&lt;td style="text-align: left">Python&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>速度&lt;/strong>&lt;/td>
&lt;td style="text-align: left">极快 (通常快几个数量级)&lt;/td>
&lt;td style="text-align: left">较慢&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>工具集&lt;/strong>&lt;/td>
&lt;td style="text-align: left">单一工具 &lt;code>uv&lt;/code> (包含 venv, pip, compile)&lt;/td>
&lt;td style="text-align: left">多个工具 (&lt;code>python -m venv&lt;/code>, &lt;code>pip&lt;/code>, &lt;code>pip-compile&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>依赖解析&lt;/strong>&lt;/td>
&lt;td style="text-align: left">内置高性能解析器&lt;/td>
&lt;td style="text-align: left">依赖外部解析器 (有时较慢或不够健壮)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>缓存&lt;/strong>&lt;/td>
&lt;td style="text-align: left">智能全局缓存&lt;/td>
&lt;td style="text-align: left">每个虚拟环境或用户级缓存 (pip &amp;gt;= 20.1)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>&lt;code>sync&lt;/code>&lt;/strong>&lt;/td>
&lt;td style="text-align: left">&lt;code>uv pip sync&lt;/code> 精确同步环境&lt;/td>
&lt;td style="text-align: left">无直接对应命令 (需手动组合)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>&lt;code>uvx&lt;/code>&lt;/strong>&lt;/td>
&lt;td style="text-align: left">&lt;code>uvx &amp;lt;cmd&amp;gt;&lt;/code> 临时执行包&lt;/td>
&lt;td style="text-align: left">&lt;code>pipx run &amp;lt;cmd&amp;gt;&lt;/code> (需要额外安装 &lt;code>pipx&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>&lt;code>compile&lt;/code>&lt;/strong>&lt;/td>
&lt;td style="text-align: left">&lt;code>uv pip compile&lt;/code> 内置依赖锁定&lt;/td>
&lt;td style="text-align: left">&lt;code>pip-compile&lt;/code> (需要额外安装 &lt;code>pip-tools&lt;/code>)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align: left">&lt;strong>错误信息&lt;/strong>&lt;/td>
&lt;td style="text-align: left">通常更清晰&lt;/td>
&lt;td style="text-align: left">有时冗长&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>主要优势总结:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>性能:&lt;/strong> 最显著的优势，尤其在大型项目或 CI/CD 环境中。&lt;/li>
&lt;li>&lt;strong>易用性:&lt;/strong> 单个工具简化了工作流程。&lt;/li>
&lt;li>&lt;strong>强大的依赖管理:&lt;/strong> 内置的编译和同步功能使得依赖管理更稳健。&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h3 id="7-总结与展望">7. 总结与展望
&lt;/h3>&lt;p>UV 是一个非常有前途的 Python 打包工具，它通过 Rust 实现带来了显著的性能提升和现代化的用户体验。它旨在简化 Python 开发者的日常工作，从创建环境到安装、管理和锁定依赖。&lt;/p>
&lt;p>虽然 UV 仍在积极开发中（截至2025年初），但它已经足够稳定和强大，可以在许多项目中使用，特别是对于那些对性能有较高要求的场景。&lt;/p>
&lt;p>&lt;strong>建议:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>尝试一下！&lt;/strong> 特别是如果你对当前 &lt;code>pip&lt;/code> 和 &lt;code>venv&lt;/code> 的速度或工作流程感到不满。&lt;/li>
&lt;li>&lt;strong>关注 Astral 的官方博客和 UV 的 GitHub 仓库&lt;/strong> (&lt;a class="link" href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"
>https://github.com/astral-sh/uv&lt;/a>) 以获取最新的更新和功能。&lt;/li>
&lt;li>可以考虑在你的项目中逐步引入 UV，例如先用它来创建虚拟环境和安装包，然后再尝试 &lt;code>uv pip compile&lt;/code> 和 &lt;code>uv pip sync&lt;/code>。&lt;/li>
&lt;/ul>
&lt;h2 id="错误解决">错误解决
&lt;/h2>&lt;h4 id="problem_with_the_package_or_the_build_environment">problem_with_the_package_or_the_build_environment
&lt;/h4>&lt;ol>
&lt;li>我在使用uv sync时候，当安装到obspy时遇到报错，具有报错信息如下&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> hint: This usually indicates a problem with the package or the build environment.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> help: &lt;span class="sb">`&lt;/span>obspy&lt;span class="sb">`&lt;/span> &lt;span class="o">(&lt;/span>v1.4.2&lt;span class="o">)&lt;/span> was included because &lt;span class="sb">`&lt;/span>dataanalysismodels&lt;span class="sb">`&lt;/span> &lt;span class="o">(&lt;/span>v0.1.0&lt;span class="o">)&lt;/span> depends on &lt;span class="sb">`&lt;/span>obspy&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进一步使用 *uv pip install obspy &amp;ndash;no-cache-dir * 命令单独安装obspy的时候报错如下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> check.warn&lt;span class="o">(&lt;/span>importable&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> error: &lt;span class="nb">command&lt;/span> &lt;span class="s1">&amp;#39;cc&amp;#39;&lt;/span> failed: No such file or directory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> hint: This usually indicates a problem with the package or the build environment.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过询问ai，这里的原因是，我缺失C的编译环境，因此使用如下命令安装C的编译环境&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">apt-get install -y build-essential gcc g++ libffi-dev python3-dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是报错 (使用 dpkg &amp;ndash;configure -a 解决)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="o">(&lt;/span>dataAnalysisModels&lt;span class="o">)&lt;/span> root@ce4322c051c6:/codes/dataAnalysisModels# apt-get install -y build-essential gcc g++ libffi-dev python3-dev
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">E: dpkg was interrupted, you must manually run &lt;span class="s1">&amp;#39;dpkg --configure -a&amp;#39;&lt;/span> to correct the problem.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>于是使用&lt;em>dpkg &amp;ndash;configure -a&lt;/em> 命令解决&lt;/p></description></item><item><title>setuptools-打包python项目为egg / 安装库函数</title><link>https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/</link><pubDate>Mon, 28 Apr 2025 16:41:54 +0800</pubDate><guid>https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/</guid><description>&lt;img src="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/index.png" alt="Featured image of post setuptools-打包python项目为egg / 安装库函数" />&lt;p>这是一个使用 &lt;code>setuptools&lt;/code> 将 Python 项目打包为 &lt;code>.egg&lt;/code> 文件的详细教程，包含源代码示例。&lt;/p>
&lt;hr>
&lt;p>&lt;strong>请注意：&lt;/strong> &lt;code>.egg&lt;/code> 格式是较旧的 Python 分发格式。目前更推荐使用 &lt;code>.whl&lt;/code> (Wheel) 格式，它在安装速度和兼容性方面有优势。然而，如果你确实需要创建 &lt;code>.egg&lt;/code> 文件（例如，为了兼容旧系统或特定工具），可以按照以下步骤进行。&lt;/p>
&lt;h2 id="简易教程1使用-setuptools-打包-python-项目为-egg">&lt;strong>简易教程1：使用 setuptools 打包 Python 项目为 Egg&lt;/strong>
&lt;/h2>&lt;h3 id="1-项目结构">&lt;strong>1. 项目结构&lt;/strong>
&lt;/h3>&lt;p>首先，你需要一个标准的 Python 项目结构。一个典型的结构如下所示：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">my_package/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── my_package/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── __init__.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── module1.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── setup.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── README.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── LICENSE
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;code>my_package/&lt;/code>: 这是你的实际 Python 包目录，其中包含你的模块和代码。&lt;/li>
&lt;li>&lt;code>my_package/__init__.py&lt;/code>: 这个文件使 &lt;code>my_package&lt;/code> 成为一个 Python 包。它可以是空的，也可以包含包的初始化代码。&lt;/li>
&lt;li>&lt;code>my_package/module1.py&lt;/code>: 这是一个示例模块文件，包含你的项目代码。&lt;/li>
&lt;li>&lt;code>setup.py&lt;/code>: 这是 &lt;code>setuptools&lt;/code> 的配置文件，用于描述你的项目以及如何打包。&lt;/li>
&lt;li>&lt;code>README.md&lt;/code>: 项目的说明文件（推荐）。&lt;/li>
&lt;li>&lt;code>LICENSE&lt;/code>: 项目的许可证文件（推荐）。&lt;/li>
&lt;/ul>
&lt;h3 id="2-创建示例项目代码">&lt;strong>2. 创建示例项目代码&lt;/strong>
&lt;/h3>&lt;p>在 &lt;code>my_package/module1.py&lt;/code> 中添加一些示例代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_package/module1.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">greet&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> 一个简单的问候函数。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Hello, &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">farewell&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> 一个简单的告别函数。
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Goodbye, &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 &lt;code>my_package/__init__.py&lt;/code> 中，你可以选择导入 &lt;code>module1&lt;/code> 中的函数，以便用户可以直接从 &lt;code>my_package&lt;/code> 导入它们：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># my_package/__init__.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">.module1&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">greet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">farewell&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__version__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;0.1.0&amp;#34;&lt;/span> &lt;span class="c1"># 添加一个版本号&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-创建-setuppy-文件">&lt;strong>3. 创建 setup.py 文件&lt;/strong>
&lt;/h3>&lt;p>&lt;code>setup.py&lt;/code> 文件是使用 &lt;code>setuptools&lt;/code> 打包项目的核心。它包含了项目的元数据和打包指令。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># setup.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">setuptools&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">setup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">find_packages&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;my_awesome_package&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 包的名称，用户将使用此名称安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">version&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;0.1.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 包的版本号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;A simple example package to demonstrate egg packaging&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 包的简短描述&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;README.md&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="c1"># 详细描述，通常来自 README 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description_content_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;text/markdown&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 详细描述的格式&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Your Name&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 作者姓名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author_email&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;your.email@example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 作者邮箱&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;https://github.com/yourusername/my_awesome_package&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 项目主页或其他 URL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">packages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">find_packages&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="c1"># 自动查找项目中的所有包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">classifiers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span> &lt;span class="c1"># 分类器，帮助用户在 PyPI 上找到你的包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Programming Language :: Python :: 3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;License :: OSI Approved :: MIT License&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Operating System :: OS Independent&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">python_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;gt;=3.6&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 项目所需的最低 Python 版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">install_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span> &lt;span class="c1"># 项目依赖的第三方库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 例如: &amp;#39;requests&amp;gt;=2.20.0&amp;#39;,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 如果你的包包含非 Python 文件 (如数据文件), 可以使用 package_data 或 data_files&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># package_data={&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># &amp;#39;my_package&amp;#39;: [&amp;#39;data/*.txt&amp;#39;],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># },&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># data_files=[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># (&amp;#39;my_data&amp;#39;, [&amp;#39;data/my_data.csv&amp;#39;]),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 定义命令行脚本 (可选)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># entry_points={&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># &amp;#39;console_scripts&amp;#39;: [&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># &amp;#39;my_script = my_package.module1:greet&amp;#39;, # 这里的 greet 是一个可执行函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># ],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># },&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 设置为 True 以便生成 egg 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">zip_safe&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>&lt;code>setup()&lt;/code> 函数参数说明：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;code>name&lt;/code>: 你的包的名称。这是用户在安装时使用的名称（例如 &lt;code>pip install my_awesome_package&lt;/code>）。&lt;/li>
&lt;li>&lt;code>version&lt;/code>: 包的版本号。遵循 &lt;a class="link" href="https://semver.org/" target="_blank" rel="noopener"
>Semantic Versioning&lt;/a> 是一个好习惯。&lt;/li>
&lt;li>&lt;code>description&lt;/code>: 包的简短描述。&lt;/li>
&lt;li>&lt;code>long_description&lt;/code>: 包的详细描述，通常从 README 文件中读取。&lt;/li>
&lt;li>&lt;code>long_description_content_type&lt;/code>: 详细描述的格式，例如 &lt;code>'text/markdown'&lt;/code>。&lt;/li>
&lt;li>&lt;code>author&lt;/code> 和 &lt;code>author_email&lt;/code>: 作者的信息。&lt;/li>
&lt;li>&lt;code>url&lt;/code>: 项目的主页或代码仓库地址。&lt;/li>
&lt;li>&lt;code>packages&lt;/code>: 一个列表，列出项目包含的所有 Python 包。&lt;code>find_packages()&lt;/code> 函数会自动查找当前目录下的所有包（包含 &lt;code>__init__.py&lt;/code> 的目录）。&lt;/li>
&lt;li>&lt;code>classifiers&lt;/code>: 一个列表，包含描述你的项目的分类器。这些分类器有助于用户在 PyPI (Python Package Index) 上搜索和过滤包。你可以在 &lt;a class="link" href="https://pypi.org/classifiers/" target="_blank" rel="noopener"
>PyPI Classifiers&lt;/a> 找到完整的列表。&lt;/li>
&lt;li>&lt;code>python_requires&lt;/code>: 指定项目兼容的 Python 版本范围。&lt;/li>
&lt;li>&lt;code>install_requires&lt;/code>: 一个列表，列出项目运行时依赖的第三方库。&lt;code>setuptools&lt;/code> 会在安装你的包时自动安装这些依赖。&lt;/li>
&lt;li>&lt;code>package_data&lt;/code>: 用于包含包内部的非 Python 文件，例如数据文件、模板等。键是包名，值是文件路径模式的列表。&lt;/li>
&lt;li>&lt;code>data_files&lt;/code>: 用于安装不在包内部的文件到指定位置。这在打包可执行脚本或配置文件时很有用。它是一个包含 &lt;code>(destination, files)&lt;/code> 元组的列表。&lt;/li>
&lt;li>&lt;code>entry_points&lt;/code>: 用于定义控制台脚本或其他入口点。这允许你在安装包后直接从命令行运行某个函数。&lt;/li>
&lt;li>&lt;code>zip_safe&lt;/code>: 如果设置为 &lt;code>True&lt;/code> (默认值)，&lt;code>setuptools&lt;/code> 会尝试将包打包成一个 ZIP 文件 (即 &lt;code>.egg&lt;/code>)。如果你的包需要在安装后从 ZIP 文件中导入模块，并且你没有使用 &lt;code>pkg_resources.resource_filename()&lt;/code> 等方法访问包内的文件，通常可以设置为 &lt;code>True&lt;/code>。如果你的包需要访问包内的非 Python 文件或有特定的加载需求，可能需要设置为 &lt;code>False&lt;/code>，这样包会以目录的形式安装。&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image.png"
width="790"
height="564"
srcset="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image_hu12821608161784346208.png 480w, https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image_hu8793925901306917774.png 1024w"
loading="lazy"
alt="项目结构"
class="gallery-image"
data-flex-grow="140"
data-flex-basis="336px"
>&lt;/p>
&lt;h3 id="4-生成-egg-文件">&lt;strong>4. 生成 Egg 文件&lt;/strong>
&lt;/h3>&lt;p>在包含 &lt;code>setup.py&lt;/code> 文件的项目根目录下，打开终端或命令行，运行以下命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python setup.py bdist_egg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>执行此命令后，&lt;code>setuptools&lt;/code> 会开始构建过程。成功后，你会在项目根目录下找到一个名为 &lt;code>dist/&lt;/code> 的目录。在该目录中，你会找到生成的 &lt;code>.egg&lt;/code> 文件，其名称类似于 &lt;code>my_awesome_package-0.1.0-py3.x.egg&lt;/code> (其中 &lt;code>py3.x&lt;/code> 表示 Python 版本)。&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-1.png"
width="529"
height="361"
srcset="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-1_hu575039073427634533.png 480w, https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-1_hu562889782879198093.png 1024w"
loading="lazy"
alt="命令行运行"
class="gallery-image"
data-flex-grow="146"
data-flex-basis="351px"
>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-2.png"
width="244"
height="313"
srcset="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-2_hu6194785327997162669.png 480w, https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-2_hu11590009610848247081.png 1024w"
loading="lazy"
alt="生成的egg文件"
class="gallery-image"
data-flex-grow="77"
data-flex-basis="187px"
>&lt;/p>
&lt;h3 id="5-安装和使用-egg-文件">&lt;strong>5. 安装和使用 Egg 文件&lt;/strong>
&lt;/h3>&lt;p>你可以使用 &lt;code>easy_install&lt;/code> 工具来安装 &lt;code>.egg&lt;/code> 文件（&lt;code>easy_install&lt;/code> 是 &lt;code>setuptools&lt;/code> 自带的安装工具）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">easy_install dist/my_awesome_package-0.1.0-py3.x.egg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者，你也可以直接将 &lt;code>.egg&lt;/code> 文件放置在 Python 的 &lt;code>sys.path&lt;/code> 中，Python 就可以直接从中导入模块。&lt;/p>
&lt;p>安装后，你就可以像安装其他 Python 包一样导入和使用你的模块了：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在 Python 交互式环境中或另一个脚本中&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">my_package&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">greet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">farewell&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">greet&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;World&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">farewell&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;User&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>注意事项和 Egg 的局限性：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>兼容性问题：&lt;/strong> Egg 文件可能在不同的操作系统、Python 版本或架构上存在兼容性问题，尤其当你的项目包含编译后的扩展模块时。&lt;/li>
&lt;li>&lt;strong>安装复杂性：&lt;/strong> 相比 Wheel，Egg 的安装通常涉及更多的运行时解压和处理，可能导致安装速度较慢。&lt;/li>
&lt;li>&lt;strong>不推荐用于新项目：&lt;/strong> 如前所述，对于新的 Python 项目，强烈建议使用 Wheel 格式进行分发。Wheel 解决了 Egg 的许多缺点，提供了更好的兼容性、更快的安装速度和更简单的结构。&lt;/li>
&lt;li>&lt;strong>&lt;code>zip_safe=True&lt;/code> 的影响：&lt;/strong> 当 &lt;code>zip_safe&lt;/code> 为 &lt;code>True&lt;/code> 时，包会被打包到 ZIP 文件中。如果你的代码需要通过文件路径访问包内部的资源（而不是使用 &lt;code>pkg_resources&lt;/code> 或 &lt;code>importlib.resources&lt;/code>），可能会出现问题。设置为 &lt;code>False&lt;/code> 会将包安装为目录，避免这个问题。&lt;/li>
&lt;/ul>
&lt;h3 id="6-如果不打包egg文件也可以直接安装">&lt;strong>6. 如果不打包egg文件也可以直接安装&lt;/strong>
&lt;/h3>&lt;p>如果第3步做好了，实际上就已经可以直接安装，在setup.py的同级目录下运行pip install .&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-3.png"
width="786"
height="867"
srcset="https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-3_hu5378120935390385936.png 480w, https://www.zata.cc/p/setuptools-%E6%89%93%E5%8C%85python%E9%A1%B9%E7%9B%AE%E4%B8%BAegg-/-%E5%AE%89%E8%A3%85%E5%BA%93%E5%87%BD%E6%95%B0/images/index/image-3_hu10956872122368186808.png 1024w"
loading="lazy"
alt="有setup.py直接安装为本地库"
class="gallery-image"
data-flex-grow="90"
data-flex-basis="217px"
>&lt;/p>
&lt;p>&lt;strong>总结&lt;/strong>&lt;/p>
&lt;p>通过创建 &lt;code>setup.py&lt;/code> 文件并使用 &lt;code>python setup.py bdist_egg&lt;/code> 命令，你可以使用 &lt;code>setuptools&lt;/code> 将你的 Python 项目打包成 &lt;code>.egg&lt;/code> 文件。虽然 Egg 格式在过去很常用，但现在 Wheel 格式已成为首选。在开发新的 Python 包时，优先考虑使用 Wheel 进行分发。如果你需要为旧系统或特定需求创建 Egg 文件，本教程提供了详细的步骤和示例代码。&lt;/p></description></item><item><title>PyInstaller使用教程</title><link>https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Sun, 27 Apr 2025 10:34:51 +0800</pubDate><guid>https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post PyInstaller使用教程" />&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 将 Python 脚本打包为单个可执行文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包为目录（包含所有依赖文件）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -D script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 指定输出目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F -o output_dir script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加图标&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F -i icon.ico script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 隐藏控制台窗口（适用于 GUI 程序）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F -w script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加数据文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F --add-data &lt;span class="s2">&amp;#34;file.txt;.&amp;#34;&lt;/span> script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加整个目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F --add-data &lt;span class="s2">&amp;#34;folder;folder&amp;#34;&lt;/span> script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理缓存和临时文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller --clean script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 指定程序名称&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F -n app_name script.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 调试模式（显示更多日志）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F --debug all script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数说明&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">-F, --onefile
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包为单个可执行文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：将 Python 脚本及其所有依赖打包成一个独立的可执行文件。生成的单一文件包含所有库和资源，运行时会解压到临时目录。适合分发简单的应用程序，但启动速度稍慢，且文件体积较大。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-D, --onedir
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包为目录，包含可执行文件和依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：将脚本打包为一个目录，包含一个主可执行文件和所有依赖（如动态链接库、资源文件）。相比 --onefile，启动速度更快，文件管理更透明，但分发时需要整个目录。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-o PATH, --out PATH
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 指定输出目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：设置 PyInstaller 生成的构建文件和最终输出的目录（包括 dist 和 build 文件夹）。默认情况下，输出在当前工作目录下，PATH 为自定义路径（如 -o ./my_output）。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-i ICON_FILE, --icon ICON_FILE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 为 Windows 可执行文件添加图标&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：为 Windows 平台的可执行文件指定自定义图标，ICON_FILE 通常为 .ico 文件路径（如 -i my_icon.ico）。仅适用于 Windows，其他平台忽略此选项。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-w, --windowed, --noconsole
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 隐藏控制台窗口，适合 GUI 应用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：运行程序时不显示命令行窗口，适用于基于 GUI 的应用程序（如 Tkinter、PyQt）。在 Windows 上，生成的是“窗口化”程序；在 macOS 上，生成 .app 包。注意：使用此选项后，程序的控制台输出将不可见。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--add-data &lt;span class="s2">&amp;#34;SOURCE;DEST&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加额外的数据文件或目录，格式为 源路径;目标路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：将非 Python 文件（如图片、配置文件、数据文件）包含到打包结果中。SOURCE 是文件或目录的路径，DEST 是相对打包目录的目标路径。例如，--add-data &amp;#34;data.txt;.&amp;#34; 将 data.txt 放在打包根目录。Windows 用分号 ; 分隔路径，Linux/macOS 用冒号 :（如 --add-data &amp;#34;data.txt:.&amp;#34;）。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--clean
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理 PyInstaller 的缓存&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：删除 PyInstaller 在构建过程中生成的临时文件和缓存（如 build 文件夹中的缓存）。在遇到打包问题或需要全新构建时使用，有助于避免旧文件干扰。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-n NAME, --name NAME
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 指定生成的可执行文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：设置生成的可执行文件或目录的名称，覆盖默认的脚本文件名。例如，-n my_app 会生成名为 my_app.exe（Windows）或 my_app（Linux/macOS）的文件或目录。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--debug &lt;span class="o">[&lt;/span>all&lt;span class="p">|&lt;/span>imports&lt;span class="p">|&lt;/span>bootloader&lt;span class="p">|&lt;/span>noarchive&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 启用调试模式，查看详细日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 说明：启用调试模式以输出详细日志，帮助诊断打包问题。可选值包括：&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># - all：输出所有调试信息。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># - imports：显示模块导入过程。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># - bootloader：显示启动加载器的调试信息。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># - noarchive：不将依赖打包为归档，保留解包状态便于检查。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 例如，--debug all 会输出最详细的日志。&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">补充说明
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">参数格式：短选项（如 -F）和长选项（如 --onefile）功能相同，短选项更简洁，长选项更具可读性。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">平台差异：某些选项（如 -i 和 -w）主要针对 Windows，Linux/macOS 可能有不同表现。例如，-w 在 macOS 上会生成 .app 包。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">路径分隔符：--add-data 的路径分隔符在 Windows 为 &lt;span class="p">;&lt;/span>（如 file.txt&lt;span class="p">;&lt;/span>.），在 Linux/macOS 为 :（如 file.txt:.）。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">常见组合：例如，pyinstaller -F -w -i icon.ico -n my_app script.py 会生成一个无控制台、带自定义图标、名为 my_app 的单一可执行文件。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="一些问题的提醒">一些问题的提醒
&lt;/h2>&lt;h3 id="打包时候指定了附加文件但是打包之后附加文件是放在了__internal文件夹里面的">&lt;code>打包时候指定了附加文件，但是打包之后附加文件是放在了__internal文件夹里面的&lt;/code>
&lt;/h3>&lt;p>我的解决方法是：&lt;/p>
&lt;ul>
&lt;li>使用python代码打包，然后打包好了之后在把文件移动到和exe一个目录&lt;/li>
&lt;/ul>
&lt;h3 id="开发的时候引用脚本没有任何问题但是打包的时候就出错">&lt;code>开发的时候引用脚本没有任何问题，但是打包的时候就出错？&lt;/code>
&lt;/h3>&lt;p>我的解决方法是：&lt;/p>
&lt;ol>
&lt;li>最好以程序的入口文件位置作为所有脚本的位置&lt;/li>
&lt;li>最好使用相对路径：我使用的是 &lt;code>Root_dir = os.path.dirname(os.path.realpath(sys.argv[0]))&lt;/code> 作为我所有函数识别的根路径&lt;/li>
&lt;/ol>
&lt;h3 id="其他打包工具">其他打包工具
&lt;/h3>&lt;ul>
&lt;li>cx_Freeze：老牌打包工具，稳定可靠&lt;/li>
&lt;li>Auto-py-to-exe：PyInstaller的GUI版本，适合新手使用&lt;/li>
&lt;li>Py2exe：仅支持Windows平台的经典工具&lt;/li>
&lt;li>PyStand： 非常容易快捷的打包方式，只需要把源码和环境拖入制定文件夹就可以&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-使用pyinstaller进行打包简单使用">2. 使用PyInstaller进行打包简单使用
&lt;/h2>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install pyinstaller
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 最简单的打包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller your_script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这将生成一个dist文件夹，其中包含可执行文件及其依赖。&lt;/p>
&lt;blockquote>
&lt;p>也可以使用pyi-makespec命令生成一个.spec文件，然后在.spec文件中进行配置，最后使用pyinstaller命令进行打包。
例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyi-makespec your_script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后在生成的.spec文件中进行配置&lt;/p>
&lt;/blockquote>
&lt;h3 id="常用参数说明">常用参数说明
&lt;/h3>&lt;p>PyInstaller提供了多个有用的参数：&lt;/p>
&lt;p>基本命令格式:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller &lt;span class="o">[&lt;/span>options&lt;span class="o">]&lt;/span> script.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>基础参数:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">-F, --onefile &lt;span class="c1"># 打包成一个单独的可执行文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-D, --onedir &lt;span class="c1"># 打包成一个文件夹(默认选项)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-n NAME &lt;span class="c1"># 指定生成的可执行文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-w, --windowed &lt;span class="c1"># Windows系统下不显示命令行窗口&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-c, --console &lt;span class="c1"># 显示命令行窗口(默认)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--noconfirm &lt;span class="c1"># 跳过确认提示,直接覆盖现有文件&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>路径和文件相关:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">--distpath DIR &lt;span class="c1"># 指定打包后的输出路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--workpath DIR &lt;span class="c1"># 指定工作目录路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--specpath DIR &lt;span class="c1"># 指定spec文件的生成路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-p DIR &lt;span class="c1"># 添加Python路径(可多次使用)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--add-data &lt;span class="c1"># 添加额外的数据文件 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 格式: source:dest (Windows用;分隔,Linux用:分隔)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--add-binary &lt;span class="c1"># 添加额外的二进制文件&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>打包控制:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">--hidden-import &lt;span class="c1"># 添加隐式导入的模块&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--additional-hooks-dir &lt;span class="c1"># 指定额外的hooks目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--runtime-hook &lt;span class="c1"># 指定运行时hook脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--exclude-module &lt;span class="c1"># 排除指定模块&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--clean &lt;span class="c1"># 清理打包前的临时文件&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常见实例:&lt;/p>
&lt;ol>
&lt;li>最简单的单文件打包(不需确认):&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller --noconfirm -F main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>打包成单文件且不显示控制台:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller --noconfirm -F -w main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="3">
&lt;li>包含数据文件的打包:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller --noconfirm -F --add-data &lt;span class="s2">&amp;#34;resources;resources&amp;#34;&lt;/span> main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Linux/MacOS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller --noconfirm -F --add-data &lt;span class="s2">&amp;#34;resources:resources&amp;#34;&lt;/span> main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>完整的生产环境打包示例:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller --noconfirm --onefile --windowed --icon &lt;span class="s2">&amp;#34;app.ico&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --hidden-import &lt;span class="s2">&amp;#34;PIL&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --add-data &lt;span class="s2">&amp;#34;resources;resources&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --add-data &lt;span class="s2">&amp;#34;config.yml;.&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --name &lt;span class="s2">&amp;#34;MyApp&amp;#34;&lt;/span> ^
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="配置文件说明">配置文件说明
&lt;/h3>&lt;p>此外，.spec这个文件提供了可以手动写隐式导入配置的功能，在配置文件中的hiddenimports中写入，然后允许pyinstaller手动选择相关.spec文件，后面不用再接其他配置&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller -F 哔哩.spec
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index-1.png"
width="396"
height="465"
srcset="https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index-1_hu10902374045341357904.png 480w, https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index-1_hu15183243871605211011.png 1024w"
loading="lazy"
alt="打包示例"
class="gallery-image"
data-flex-grow="85"
data-flex-basis="204px"
>&lt;/p>
&lt;p>下面是我用于打包gradio项目的gradio源码和一个配置文件的示例，&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># gradio_app.py &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">gradio&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">gr&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">greet&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;Hello &amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s2">&amp;#34;!!&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">demo&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Interface&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fn&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">greet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">inputs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">outputs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">demo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>配置文件&lt;/p>
&lt;p>生成方式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl"> pyi-makespec --collect-all aiofiles --collect-all annotated_types --collect-all anyio --collect-all certifi --collect-all charset_normalizer --collect-all click --collect-all colorama --collect-all dateutil --collect-all fastapi --collect-all ffmpy --collect-all filelock --collect-all fsspec --collect-all gradio --collect-all gradio_client --collect-all groovy --collect-all h11 --collect-all httpcore --collect-all httpx --collect-all huggingface_hub --collect-all idna --collect-all jinja2 --collect-all lxml --collect-all markdown_it --collect-all markupsafe --collect-all mdurl --collect-all multipart --collect-all numpy --collect-all opencc --collect-all orjson --collect-all packaging --collect-all pandas --collect-all pillow --collect-all pip --collect-all pydantic --collect-all pydantic_core --collect-all pydub --collect-all pygments --collect-all python_multipart --collect-all pytz --collect-all requests --collect-all rich --collect-all ruff --collect-all safehttpx --collect-all semantic_version --collect-all setuptools --collect-all shellingham --collect-all sniffio --collect-all starlette --collect-all tomlkit --collect-all tqdm --collect-all typer --collect-all tzdata --collect-all urllib3 --collect-all uvicorn --collect-all websockets --collect-all wheel gradio_app.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下面是生成得到的配置文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># gradio_app.spec&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -*- mode: python ; coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">PyInstaller.utils.hooks&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">collect_all&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">binaries&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;aiofiles&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;annotated_types&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;anyio&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;certifi&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;charset_normalizer&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;click&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;colorama&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;dateutil&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;fastapi&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;ffmpy&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;filelock&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;fsspec&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;gradio&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;gradio_client&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;groovy&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;h11&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;httpcore&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;httpx&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;huggingface_hub&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;idna&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;jinja2&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;lxml&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;markdown_it&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;markupsafe&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;mdurl&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;multipart&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;numpy&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;opencc&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;orjson&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;packaging&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pandas&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pillow&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pip&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pydantic&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pydantic_core&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pydub&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pygments&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;python_multipart&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;pytz&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;requests&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;rich&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;ruff&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;safehttpx&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;semantic_version&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;setuptools&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;shellingham&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;sniffio&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;starlette&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;tomlkit&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;tqdm&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;typer&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;tzdata&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;urllib3&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;uvicorn&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;websockets&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tmp_ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collect_all&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;wheel&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">datas&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">binaries&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">];&lt;/span> &lt;span class="n">hiddenimports&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="n">tmp_ret&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Analysis&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;gradio_app.py&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pathex&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">binaries&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">binaries&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">datas&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">datas&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hiddenimports&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">hiddenimports&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hookspath&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hooksconfig&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">runtime_hooks&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">excludes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noarchive&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">module_collection_mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;gradio&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;py&amp;#39;&lt;/span>&lt;span class="p">,},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">optimize&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pyz&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PYZ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pure&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">exe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">EXE&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pyz&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scripts&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exclude_binaries&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;gradio_app&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">debug&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bootloader_ignore_signals&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">upx&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">console&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">disable_windowed_traceback&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">argv_emulation&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_arch&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">codesign_identity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">entitlements_file&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">coll&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">COLLECT&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exe&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">binaries&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">datas&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">upx&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">upx_exclude&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;gradio_app&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="1-analysis-部分">1. &lt;code>Analysis&lt;/code> 部分
&lt;/h4>&lt;p>&lt;img src="https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/images.png"
width="307"
height="225"
srcset="https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/images_hu12469336217368322857.png 480w, https://www.zata.cc/p/pyinstaller%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/images_hu6955948823041681397.png 1024w"
loading="lazy"
alt="Analysis部分"
class="gallery-image"
data-flex-grow="136"
data-flex-basis="327px"
>&lt;/p>
&lt;p>&lt;code>Analysis&lt;/code> 是 PyInstaller 的核心类，用于分析 Python 脚本的依赖关系并收集打包所需的文件。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;code>['gradio_app.py']&lt;/code>&lt;/strong>:&lt;br>
指定要打包的主 Python 脚本文件。这里是 &lt;code>gradio_app.py&lt;/code>，表示这是应用程序的入口脚本。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>pathex=[]&lt;/code>&lt;/strong>:&lt;br>
指定额外的路径，PyInstaller 会在这些路径中查找模块或文件。通常为空，PyInstaller 会自动处理标准路径。如果你的项目有非标准路径的依赖，可以在这里添加。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>binaries=binaries&lt;/code>&lt;/strong>:&lt;br>
指定额外的二进制文件（如 DLL 文件或共享库）。&lt;code>binaries&lt;/code> 是一个预定义的列表，包含需要打包的非 Python 二进制依赖。如果为空，则 PyInstaller 自动检测。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>datas=datas&lt;/code>&lt;/strong>:&lt;br>
指定额外的非代码文件（如图像、配置文件、HTML 模板等）。&lt;code>datas&lt;/code> 是一个列表，格式通常为 &lt;code>[(源路径, 目标路径)]&lt;/code>。这些文件会被打包到最终的可执行文件中。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>hiddenimports=hiddenimports&lt;/code>&lt;/strong>:&lt;br>
指定 PyInstaller 无法自动检测的隐式导入模块。例如，某些动态导入的模块（如 Gradio 的依赖）需要手动列出，防止打包后缺少模块。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>hookspath=[]&lt;/code>&lt;/strong>:&lt;br>
指定自定义 PyInstaller 钩子文件的路径。钩子文件用于处理特定模块的打包逻辑（如 Gradio 的复杂依赖）。为空时使用默认钩子。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>hooksconfig={}&lt;/code>&lt;/strong>:&lt;br>
提供特定模块的钩子配置。某些模块需要额外的配置来正确打包，格式为字典。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>runtime_hooks=[]&lt;/code>&lt;/strong>:&lt;br>
指定运行时钩子脚本，这些脚本会在可执行文件启动时运行，用于动态修改环境（如设置环境变量）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>excludes=[]&lt;/code>&lt;/strong>:&lt;br>
指定要从打包中排除的模块。用于减少包体积，排除不必要的模块。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>noarchive=False&lt;/code>&lt;/strong>:&lt;br>
是否禁用归档模式。如果为 &lt;code>True&lt;/code>，PyInstaller 不会将文件打包为压缩归档，而是直接解压到临时目录。通常保持 &lt;code>False&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>module_collection_mode={'gradio': 'py'}&lt;/code>&lt;/strong>:&lt;br>
指定模块的收集模式。&lt;code>'gradio': 'py'&lt;/code> 表示 Gradio 模块以源代码形式（&lt;code>.py&lt;/code> 文件）收集，而不是编译为 &lt;code>.pyc&lt;/code> 文件。这在调试或某些模块不兼容编译时有用。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>optimize=0&lt;/code>&lt;/strong>:&lt;br>
指定 Python 字节码优化的级别。&lt;/p>
&lt;ul>
&lt;li>&lt;code>0&lt;/code>: 无优化（默认）。&lt;/li>
&lt;li>&lt;code>1&lt;/code>: 移除 &lt;code>assert&lt;/code> 语句。&lt;/li>
&lt;li>&lt;code>2&lt;/code>: 移除 &lt;code>assert&lt;/code> 和文档字符串。&lt;br>
通常设为 &lt;code>0&lt;/code> 以保留调试信息。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="2-pyz-部分">2. &lt;code>PYZ&lt;/code> 部分
&lt;/h4>&lt;p>&lt;code>PYZ&lt;/code> 用于创建 Python 字节码的压缩归档文件（&lt;code>.pyz&lt;/code> 文件），包含所有 Python 模块。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>a.pure&lt;/code>&lt;/strong>:&lt;br>
来自 &lt;code>Analysis&lt;/code> 的纯 Python 模块列表（不包括 C 扩展模块）。&lt;code>PYZ&lt;/code> 将这些模块打包为一个压缩归档，供可执行文件加载。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="3-exe-部分">3. &lt;code>EXE&lt;/code> 部分
&lt;/h4>&lt;p>&lt;code>EXE&lt;/code> 定义了最终生成的可执行文件。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;code>pyz&lt;/code>&lt;/strong>:&lt;br>
上一步生成的 &lt;code>PYZ&lt;/code> 对象，包含 Python 字节码。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>a.scripts&lt;/code>&lt;/strong>:&lt;br>
来自 &lt;code>Analysis&lt;/code> 的脚本列表，通常包括主脚本（&lt;code>gradio_app.py&lt;/code>）和 PyInstaller 的启动脚本。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>[]&lt;/code>&lt;/strong>:&lt;br>
额外的二进制文件列表，添加到可执行文件中。此处为空，依赖已在 &lt;code>Analysis&lt;/code> 中处理。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>exclude_binaries=True&lt;/code>&lt;/strong>:&lt;br>
是否将二进制文件排除在可执行文件之外。如果为 &lt;code>True&lt;/code>，二进制文件不会嵌入 &lt;code>.exe&lt;/code> 文件，而是由 &lt;code>COLLECT&lt;/code> 步骤单独收集到输出目录。这减少 &lt;code>.exe&lt;/code> 文件大小。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>name='gradio_app'&lt;/code>&lt;/strong>:&lt;br>
可执行文件的名称。生成的文件将命名为 &lt;code>gradio_app.exe&lt;/code>（Windows）或 &lt;code>gradio_app&lt;/code>（Linux/macOS）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>debug=False&lt;/code>&lt;/strong>:&lt;br>
是否启用调试模式。如果为 &lt;code>True&lt;/code>，会在运行时输出详细的调试信息（如模块加载日志）。通常设为 &lt;code>False&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>bootloader_ignore_signals=False&lt;/code>&lt;/strong>:&lt;br>
是否让 PyInstaller 的引导程序（bootloader）忽略系统信号（如 &lt;code>SIGINT&lt;/code>）。通常保持默认值 &lt;code>False&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>strip=False&lt;/code>&lt;/strong>:&lt;br>
是否对可执行文件进行符号剥离（移除调试符号）。设为 &lt;code>True&lt;/code> 可减小文件大小，但可能影响调试。通常设为 &lt;code>False&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>upx=True&lt;/code>&lt;/strong>:&lt;br>
是否使用 UPX（Ultimate Packer for Executables）压缩可执行文件。UPX 可以显著减小文件大小，但可能导致杀毒软件误报或兼容性问题。设为 &lt;code>True&lt;/code> 表示启用。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>console=True&lt;/code>&lt;/strong>:&lt;br>
是否生成带有控制台窗口的可执行文件。&lt;/p>
&lt;ul>
&lt;li>&lt;code>True&lt;/code>: 运行时会显示命令行窗口（适合调试或 CLI 应用）。&lt;/li>
&lt;li>&lt;code>False&lt;/code>: 无控制台窗口（适合 GUI 应用）。&lt;br>
Gradio 应用通常是 Web 应用，可能不需要控制台，但这里设为 &lt;code>True&lt;/code>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>disable_windowed_traceback=False&lt;/code>&lt;/strong>:&lt;br>
是否在 Windows GUI 模式下禁用错误跟踪。如果为 &lt;code>True&lt;/code>，GUI 模式下的错误不会显示详细回溯。保持 &lt;code>False&lt;/code> 以便调试。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>argv_emulation=False&lt;/code>&lt;/strong>:&lt;br>
是否模拟命令行参数传递（主要用于 macOS）。通常设为 &lt;code>False&lt;/code>。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>target_arch=None&lt;/code>&lt;/strong>:&lt;br>
指定目标架构（如 &lt;code>x86_64&lt;/code> 或 &lt;code>arm64&lt;/code>）。为 &lt;code>None&lt;/code> 时，PyInstaller 自动选择当前系统架构。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>codesign_identity=None&lt;/code>&lt;/strong>:&lt;br>
指定 macOS 代码签名的身份。为空表示不签名。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>entitlements_file=None&lt;/code>&lt;/strong>:&lt;br>
指定 macOS 代码签名的权限文件。为空表示使用默认权限。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="4-collect-部分">4. &lt;code>COLLECT&lt;/code> 部分
&lt;/h4>&lt;p>&lt;code>COLLECT&lt;/code> 将所有文件（可执行文件、二进制文件、数据文件等）收集到一个输出目录。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>&lt;code>exe&lt;/code>&lt;/strong>:&lt;br>
上一步生成的 &lt;code>EXE&lt;/code> 对象，即主可执行文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>a.binaries&lt;/code>&lt;/strong>:&lt;br>
来自 &lt;code>Analysis&lt;/code> 的二进制文件列表，包含依赖的 DLL、共享库等。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>a.datas&lt;/code>&lt;/strong>:&lt;br>
来自 &lt;code>Analysis&lt;/code> 的数据文件列表，包含非代码文件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>strip=False&lt;/code>&lt;/strong>:&lt;br>
是否对收集的二进制文件进行符号剥离。保持 &lt;code>False&lt;/code> 以保留调试信息。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>upx=True&lt;/code>&lt;/strong>:&lt;br>
是否对收集的二进制文件应用 UPX 压缩。与 &lt;code>EXE&lt;/code> 部分的 &lt;code>upx&lt;/code> 参数类似。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>upx_exclude=[]&lt;/code>&lt;/strong>:&lt;br>
指定不使用 UPX 压缩的文件列表。如果某些文件压缩后会导致问题，可以在这里列出。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>&lt;code>name='gradio_app'&lt;/code>&lt;/strong>:&lt;br>
输出目录的名称。所有文件将被收集到 &lt;code>dist/gradio_app&lt;/code> 目录下。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>注意事项:&lt;/p>
&lt;ol>
&lt;li>打包前确保在虚拟环境中安装了所有依赖&lt;/li>
&lt;li>如果程序引用了动态库或特殊文件,需要使用&amp;ndash;add-data或&amp;ndash;add-binary添加&lt;/li>
&lt;li>某些模块可能需要手动添加hidden-import&lt;/li>
&lt;li>建议先使用-D选项测试,确认无误后再使用-F打包&lt;/li>
&lt;/ol>
&lt;p>这样的参数列表更加完整,包含了&amp;ndash;noconfirm参数的使用说明。您可以根据具体需求选择合适的参数组合。&lt;/p>
&lt;h2 id="3-实战案例打包一个gui应用">3. 实战案例：打包一个GUI应用
&lt;/h2>&lt;p>下面是一个完整的案例，展示如何打包一个使用tkinter的GUI应用。&lt;/p>
&lt;h3 id="31-示例程序代码">3.1 示例程序代码
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">tk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">messagebox&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">SimpleApp&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">root&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">root&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;简单计算器&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 创建输入框&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Entry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num1&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Entry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 创建按钮&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">calc_button&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Button&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;计算&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">command&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">calculate&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">calc_button&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 显示结果的标签&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">result_label&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Label&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;结果：&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">result_label&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pack&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">calculate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num1&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">n2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">result_label&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;结果：&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">ValueError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showerror&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;错误&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;请输入有效的数字！&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Tk&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">SimpleApp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mainloop&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="32-打包配置文件">3.2 打包配置文件
&lt;/h3>&lt;p>创建一个名为 &lt;code>app.spec&lt;/code> 的配置文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># -*- mode: python ; coding: utf-8 -*-&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">block_cipher&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Analysis&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="s1">&amp;#39;your_script.py&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pathex&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">binaries&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">datas&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hiddenimports&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hookspath&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">hooksconfig&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">runtime_hooks&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">excludes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">win_no_prefer_redirects&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">win_private_assemblies&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cipher&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">block_cipher&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noarchive&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">pyz&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">PYZ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pure&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zipped_data&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cipher&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">block_cipher&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">exe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">EXE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">pyz&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scripts&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">binaries&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zipfiles&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">datas&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;MyApp&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">debug&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bootloader_ignore_signals&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">strip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">upx&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">upx_exclude&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">runtime_tmpdir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">console&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">disable_windowed_traceback&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_arch&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">codesign_identity&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">entitlements_file&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;icon.ico&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="33-执行打包">3.3 执行打包
&lt;/h3>&lt;p>使用配置文件进行打包：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller app.spec
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="4-常见问题及解决方案">4. 常见问题及解决方案
&lt;/h2>&lt;h3 id="41-找不到模块">4.1 找不到模块
&lt;/h3>&lt;p>如果打包后运行提示找不到某些模块，可以：&lt;/p>
&lt;ol>
&lt;li>使用 &lt;code>--hidden-import&lt;/code> 参数手动添加&lt;/li>
&lt;li>在spec文件中的 &lt;code>hiddenimports&lt;/code> 列表中添加&lt;/li>
&lt;/ol>
&lt;h3 id="42-文件路径问题">4.2 文件路径问题
&lt;/h3>&lt;p>在打包后的程序中，需要特别注意文件路径的处理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取程序运行时的真实路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="nb">getattr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;frozen&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">False&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">application_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">executable&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">application_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">abspath&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="vm">__file__&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="43-减小文件体积">4.3 减小文件体积
&lt;/h3>&lt;p>可以通过以下方法减小打包后的文件体积：&lt;/p>
&lt;ol>
&lt;li>使用虚拟环境，只安装必要的依赖&lt;/li>
&lt;li>使用 &lt;code>--exclude-module&lt;/code> 排除不需要的模块&lt;/li>
&lt;li>使用UPX压缩（如果可用）&lt;/li>
&lt;/ol>
&lt;h3 id="实践建议">实践建议
&lt;/h3>&lt;ol>
&lt;li>始终使用虚拟环境进行开发和打包&lt;/li>
&lt;li>仔细检查依赖项，避免包含不必要的模块&lt;/li>
&lt;li>在目标平台上测试打包后的程序&lt;/li>
&lt;li>保存并管理spec文件，方便后续修改和重新打包&lt;/li>
&lt;li>记录打包过程中的问题和解决方案&lt;/li>
&lt;/ol>
&lt;h3 id="6-环境相关注意事项">6. 环境相关注意事项
&lt;/h3>&lt;h4 id="61-python版本兼容性">6.1 Python版本兼容性
&lt;/h4>&lt;ul>
&lt;li>建议使用与开发环境相同的Python版本进行打包&lt;/li>
&lt;li>注意目标机器的系统架构(32位/64位)&lt;/li>
&lt;li>某些第三方库可能与特定Python版本不兼容，需提前测试&lt;/li>
&lt;/ul>
&lt;h4 id="62-虚拟环境使用">6.2 虚拟环境使用
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -m venv venv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 激活虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">venv&lt;span class="se">\S&lt;/span>cripts&lt;span class="se">\a&lt;/span>ctivate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Linux/Mac&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> venv/bin/activate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="63-依赖管理">6.3 依赖管理
&lt;/h4>&lt;ul>
&lt;li>使用&lt;code>pipreqs&lt;/code>生成准确的依赖列表：&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install pipreqs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pipreqs ./
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>定期更新&lt;code>requirements.txt&lt;/code>&lt;/li>
&lt;li>检查并移除未使用的依赖&lt;/li>
&lt;/ul></description></item><item><title>Pyinstaller-打包gradio项目</title><link>https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/</link><pubDate>Sun, 27 Apr 2025 00:42:01 +0800</pubDate><guid>https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/</guid><description>&lt;img src="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/index.png" alt="Featured image of post Pyinstaller-打包gradio项目" />&lt;p>&lt;span style="color : red"> 由于gradio库中的代码都是pyi文件，而pyinstaller 在打包时默认库中的都是pyc文件，故而需要修改spec文件，指定对gradio库下的代码进行编译。 &lt;/span>&lt;/p>
&lt;p>参考： &lt;a class="link" href="https://cloud.tencent.com/developer/article/2503987" target="_blank" rel="noopener"
>https://cloud.tencent.com/developer/article/2503987&lt;/a>&lt;/p>
&lt;p>注意上面的链接中：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/images2.png"
width="826"
height="530"
srcset="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/images2_hu4877119232049664722.png 480w, https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/images2_hu8131339319198976930.png 1024w"
loading="lazy"
alt="参考链接中应该是.py"
class="gallery-image"
data-flex-grow="155"
data-flex-basis="374px"
>&lt;/p>
&lt;hr>
&lt;h2 id="打包示例20250426-不推荐打包出来的文件非常大">打包示例（20250426）： 不推荐，打包出来的文件非常大
&lt;/h2>&lt;h3 id="1-代码的例子">1 代码的例子
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#gradio_example.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">gradio&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">gr&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">logging&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置日志&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">basicConfig&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">level&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">INFO&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">format&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">%(asctime)s&lt;/span>&lt;span class="s1"> - &lt;/span>&lt;span class="si">%(levelname)s&lt;/span>&lt;span class="s1"> - &lt;/span>&lt;span class="si">%(message)s&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">handlers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">StreamHandler&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stdout&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">classify_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 这里我们使用一个简单的示例分类器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 在实际应用中，这里可以替换为你的机器学习模型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;短文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">elif&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">50&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;中等长度文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;长文本&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;分类过程中发生错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;错误: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 创建 Gradio 界面&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">demo&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">gr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Interface&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fn&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">classify_text&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">inputs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">gr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Textbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;输入文本&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;请输入要分类的文本...&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">outputs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">gr&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Textbox&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">label&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;分类结果&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;文本长度分类器&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;这是一个简单的文本长度分类器示例。输入文本后，它会根据文本长度返回分类结果。&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">examples&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;这是一个短文本&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;这是一个中等长度的文本，包含了一些描述性的内容&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;这是一个非常长的文本，包含了很多详细的信息和描述，可以用来测试分类器的性能，看看它如何处理较长的输入内容。&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 启动界面&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">info&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;正在启动 Gradio 界面...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">demo&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">Exception&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;程序启动失败: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">input&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;按回车键退出...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image.png"
width="1222"
height="402"
srcset="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image_hu10452785175027258335.png 480w, https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image_hu10927806963402584687.png 1024w"
loading="lazy"
alt="代码展示结果"
class="gallery-image"
data-flex-grow="303"
data-flex-basis="729px"
>&lt;/p>
&lt;h3 id="2-生成spec文件并增加一行">2 生成.spec文件并增加一行
&lt;/h3>&lt;p>gradio会有很多依赖库，这些都是要的，具体可以使用pip freeze 查看依赖&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyi-makespec --onefile --collect-all aiofiles --collect-all annotated_types --collect-all anyio --collect-all certifi --collect-all charset_normalizer --collect-all click --collect-all colorama --collect-all dateutil --collect-all fastapi --collect-all ffmpy --collect-all filelock --collect-all fsspec --collect-all gradio --collect-all gradio_client --collect-all groovy --collect-all h11 --collect-all httpcore --collect-all httpx --collect-all huggingface_hub --collect-all idna --collect-all jinja2 --collect-all lxml --collect-all markdown_it --collect-all markupsafe --collect-all mdurl --collect-all multipart --collect-all numpy --collect-all opencc --collect-all orjson --collect-all packaging --collect-all pandas --collect-all pillow --collect-all pip --collect-all pydantic --collect-all pydantic_core --collect-all pydub --collect-all pygments --collect-all python_multipart --collect-all pytz --collect-all requests --collect-all rich --collect-all ruff --collect-all safehttpx --collect-all semantic_version --collect-all setuptools --collect-all shellingham --collect-all sniffio --collect-all starlette --collect-all tomlkit --collect-all tqdm --collect-all typer --collect-all tzdata --collect-all urllib3 --collect-all uvicorn --collect-all websockets --collect-all wheel gradio_example.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后增加一行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="line">&lt;span class="cl">&lt;span class="n">module_collection_mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;gradio&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s1">&amp;#39;py&amp;#39;&lt;/span>&lt;span class="p">,},&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image3.png"
width="1093"
height="561"
srcset="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image3_hu7652368012585086085.png 480w, https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image3_hu4984567296718324882.png 1024w"
loading="lazy"
alt="增加一行编译方式"
class="gallery-image"
data-flex-grow="194"
data-flex-basis="467px"
>&lt;/p>
&lt;h3 id="3-使用spec文件打包exe">3 使用spec文件打包exe
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller gradio.spec
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image4.png"
width="995"
height="397"
srcset="https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image4_hu806738595712677383.png 480w, https://www.zata.cc/p/pyinstaller-%E6%89%93%E5%8C%85gradio%E9%A1%B9%E7%9B%AE/images/index/image4_hu18194863580103654986.png 1024w"
loading="lazy"
alt="打包完成"
class="gallery-image"
data-flex-grow="250"
data-flex-basis="601px"
>&lt;/p></description></item><item><title>conda使用教程|pip使用教程|依赖安装_使用教程</title><link>https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</link><pubDate>Mon, 10 Mar 2025 14:00:34 +0800</pubDate><guid>https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/index.png" alt="Featured image of post conda使用教程|pip使用教程|依赖安装_使用教程" />&lt;h1 id="-目录">📚 目录
&lt;/h1>&lt;ul>
&lt;li>&lt;a class="link" href="#1-conda-%e5%9f%ba%e7%a1%80%e4%b8%8e%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4" >1. Conda 基础与常用命令&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#2-conda-%e5%ae%89%e8%a3%85%e4%b8%8e%e7%8e%af%e5%a2%83%e7%ae%a1%e7%90%86" >2. Conda 安装与环境管理&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#3-pip-%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97" >3. Pip 使用指南&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#4-%e9%95%9c%e5%83%8f%e6%ba%90%e9%85%8d%e7%bd%ae" >4. 镜像源配置&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#5-%e5%b0%86%e8%87%aa%e5%ae%9a%e4%b9%89%e4%bb%a3%e7%a0%81%e5%8c%85%e5%ae%89%e8%a3%85%e5%88%b0%e7%8e%af%e5%a2%83" >5. 将自定义代码包安装到环境&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#6-%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e4%b8%8e%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" >6. 常见问题与解决方案&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#7-conda-%e4%b8%8e-pip-%e5%8c%ba%e5%88%ab%e5%af%b9%e6%af%94" >7. Conda 与 Pip 区别对比&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#8-%e5%b0%86python%e5%8c%85%e5%8f%91%e5%b8%83%e5%88%b0github%e5%b9%b6%e9%80%9a%e8%bf%87pip%e5%ae%89%e8%a3%85" >8. 将Python包发布到GitHub并通过pip安装&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="1-conda-基础与常用命令">1. Conda 基础与常用命令
&lt;/h2>&lt;h3 id="-核心命令">🚀 核心命令
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 环境管理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n env_name &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8 &lt;span class="c1"># 创建新环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda activate env_name &lt;span class="c1"># 激活环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda deactivate &lt;span class="c1"># 退出环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env list &lt;span class="c1"># 列出所有环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env remove -n env_name &lt;span class="c1"># 删除环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 包管理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install package_name &lt;span class="c1"># 安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install &lt;span class="nv">package_name&lt;/span>&lt;span class="o">=&lt;/span>1.2.3 &lt;span class="c1"># 安装特定版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install -c channel_name package_name &lt;span class="c1"># 指定通道安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda remove package_name &lt;span class="c1"># 卸载包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda list &lt;span class="c1"># 列出已安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda search package_name &lt;span class="c1"># 搜索包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 系统维护&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda --version &lt;span class="c1"># 查看版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda update conda &lt;span class="c1"># 更新conda&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda update --all &lt;span class="c1"># 更新所有包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda clean --all &lt;span class="c1"># 清理缓存&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;details>
&lt;summary>🔧 点击展开更多高级命令&lt;/summary>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 环境导入导出&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env &lt;span class="nb">export&lt;/span> &amp;gt; environment.yml &lt;span class="c1"># 导出环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env create -f environment.yml &lt;span class="c1"># 从文件创建环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda list --export &amp;gt; requirements.txt &lt;span class="c1"># 导出包列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 批量操作&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n env_name &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8 numpy pandas &lt;span class="c1"># 创建时安装多个包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install --file requirements.txt &lt;span class="c1"># 批量安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda run -n env_name python script.py &lt;span class="c1"># 在特定环境运行命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置管理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --show channels &lt;span class="c1"># 查看通道配置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --add channels channel_name &lt;span class="c1"># 添加通道&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --remove channels channel_name &lt;span class="c1"># 移除通道&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --set channel_priority strict &lt;span class="c1"># 设置通道优先级&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --set auto_activate_base &lt;span class="nb">false&lt;/span> &lt;span class="c1"># 禁用自动激活base&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env config vars &lt;span class="nb">set&lt;/span> &lt;span class="nv">VAR_NAME&lt;/span>&lt;span class="o">=&lt;/span>value &lt;span class="c1"># 设置环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env config vars list &lt;span class="c1"># 查看环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env config vars &lt;span class="nb">unset&lt;/span> VAR_NAME &lt;span class="c1"># 删除环境变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 诊断工具&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda info --cache &lt;span class="c1"># 查看缓存位置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda doctor &lt;span class="c1"># 检查环境完整性&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda list --revisions &lt;span class="c1"># 查看历史版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install package_name --revision N &lt;span class="c1"># 回滚到特定版本&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/details>
&lt;hr>
&lt;h2 id="2-conda-安装与环境管理">2. Conda 安装与环境管理
&lt;/h2>&lt;h3 id="-conda-安装">📦 Conda 安装
&lt;/h3>&lt;h4 id="linux-系统安装">Linux 系统安装
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 下载Miniconda&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">bash Miniconda3-latest-Linux-x86_64.sh
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 初始化环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> ~
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="其他系统安装参考">其他系统安装参考
&lt;/h4>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>操作系统&lt;/th>
&lt;th>安装教程&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Windows&lt;/strong>&lt;/td>
&lt;td>&lt;a class="link" href="https://blog.csdn.net/ming12131342/article/details/140233867" target="_blank" rel="noopener"
>CSDN教程&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Ubuntu&lt;/strong>&lt;/td>
&lt;td>&lt;a class="link" href="https://blog.csdn.net/qq_41685627/article/details/139057628" target="_blank" rel="noopener"
>CSDN教程&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="-环境管理">🏗️ 环境管理
&lt;/h3>&lt;h4 id="创建环境">创建环境
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本创建&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n your_env_name &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建时安装多个包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n your_env_name &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8 numpy scipy pandas
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 从现有环境克隆&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create --name new_env --clone existing_env
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="删除环境">删除环境
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 退出环境（如果正在使用）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda deactivate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda remove -n ENV_NAME --all
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或者&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env remove -n ENV_NAME
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>⚠️ &lt;strong>注意&lt;/strong>：删除环境前请确保已退出该环境，使用 &lt;code>--all&lt;/code> 标志会删除环境中的所有包。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="3-pip-使用指南">3. Pip 使用指南
&lt;/h2>&lt;h3 id="-基本用法">🔧 基本用法
&lt;/h3>&lt;h4 id="版本管理">版本管理
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip --version &lt;span class="c1"># 查看版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install --upgrade pip &lt;span class="c1"># 升级pip&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="包管理">包管理
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install package_name &lt;span class="c1"># 安装最新版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install &lt;span class="nv">package_name&lt;/span>&lt;span class="o">==&lt;/span>2.28.1 &lt;span class="c1"># 安装指定版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install package_name&amp;gt;&lt;span class="o">=&lt;/span>2.0.0 &lt;span class="c1"># 安装最低版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 升级和卸载&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install --upgrade package_name &lt;span class="c1"># 升级包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip uninstall package_name &lt;span class="c1"># 卸载包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip list &lt;span class="c1"># 列出已安装包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip show package_name &lt;span class="c1"># 显示包详情&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip search package_name &lt;span class="c1"># 搜索包（部分版本可用）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="批量操作">批量操作
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 批量安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成依赖文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip freeze &amp;gt; requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生成项目依赖（推荐）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install pipreqs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pipreqs ./
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-实用建议">💡 实用建议
&lt;/h3>&lt;h4 id="虚拟环境使用">虚拟环境使用
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -m venv myenv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 激活虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> myenv/bin/activate &lt;span class="c1"># Linux/Mac&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">myenv&lt;span class="se">\S&lt;/span>cripts&lt;span class="se">\a&lt;/span>ctivate &lt;span class="c1"># Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 退出虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">deactivate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="网络配置">网络配置
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用代理&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install package_name --proxy&lt;span class="o">=&lt;/span>http://代理地址:端口
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用国内镜像源&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 信任主机（解决SSL问题）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install package_name --trusted-host pypi.org --trusted-host pypi.python.org
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="4-镜像源配置">4. 镜像源配置
&lt;/h2>&lt;h3 id="-pip-镜像源">🌐 Pip 镜像源
&lt;/h3>&lt;h4 id="常用国内镜像源">常用国内镜像源
&lt;/h4>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>镜像源&lt;/th>
&lt;th>地址&lt;/th>
&lt;th>特点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>清华大学&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://pypi.tuna.tsinghua.edu.cn/simple&lt;/code>&lt;/td>
&lt;td>速度快，更新及时&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>阿里云&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://mirrors.aliyun.com/pypi/simple/&lt;/code>&lt;/td>
&lt;td>稳定性好&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>中科大&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://pypi.mirrors.ustc.edu.cn/simple/&lt;/code>&lt;/td>
&lt;td>教育网友好&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>豆瓣&lt;/strong>&lt;/td>
&lt;td>&lt;code>http://pypi.douban.com/simple/&lt;/code>&lt;/td>
&lt;td>老牌镜像&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>华为云&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://repo.huaweicloud.com/pypi/simple/&lt;/code>&lt;/td>
&lt;td>企业级稳定&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="临时使用">临时使用
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="永久配置">永久配置
&lt;/h4>&lt;p>&lt;strong>Linux/Mac 系统&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建配置目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p ~/.pip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编辑配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vim ~/.pip/pip.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Windows 系统&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置文件位置：%USERPROFILE%\pip\pip.ini&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>配置内容&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[global]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">index-url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">https://pypi.tuna.tsinghua.edu.cn/simple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">trusted-host&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">pypi.tuna.tsinghua.edu.cn&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-conda-镜像源">🔄 Conda 镜像源
&lt;/h3>&lt;h4 id="常用国内镜像源-1">常用国内镜像源
&lt;/h4>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>镜像源&lt;/th>
&lt;th>主要地址&lt;/th>
&lt;th>配置命令&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>清华大学&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/&lt;/code>&lt;/td>
&lt;td>&lt;code>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>中科大&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://mirrors.ustc.edu.cn/anaconda/pkgs/main/&lt;/code>&lt;/td>
&lt;td>&lt;code>conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>上海交大&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://mirror.sjtu.edu.cn/anaconda/pkgs/main/&lt;/code>&lt;/td>
&lt;td>&lt;code>conda config --add channels https://mirror.sjtu.edu.cn/anaconda/pkgs/main&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>阿里云&lt;/strong>&lt;/td>
&lt;td>&lt;code>https://mirrors.aliyun.com/anaconda/pkgs/main/&lt;/code>&lt;/td>
&lt;td>&lt;code>conda config --add channels https://mirrors.aliyun.com/anaconda/pkgs/main&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="配置示例清华源">配置示例（清华源）
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加清华源&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 显示通道地址&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --set show_channel_urls yes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="conda-forge-源">conda-forge 源
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 添加conda-forge社区源&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --add channels conda-forge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="管理配置">管理配置
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看当前配置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --show channels
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复默认源&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --remove-key channels
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 移除特定通道&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda config --remove channels channel_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="5-将自定义代码包安装到环境">5. 将自定义代码包安装到环境
&lt;/h2>&lt;h3 id="-项目结构准备">📁 项目结构准备
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">project/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── nirapi/ # 你的代码包
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── __init__.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── utils.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── test.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── AnalysisClass/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── __init__.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── setup.py # 安装配置文件
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-安装步骤">⚙️ 安装步骤
&lt;/h3>&lt;h4 id="step-1-安装setuptools">Step 1: 安装setuptools
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install setuptools
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="step-2-创建setuppy文件">Step 2: 创建setup.py文件
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># coding=utf-8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">setuptools&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">setup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">find_packages&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;nirapi&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 包名&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">version&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;1.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 版本号&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zata&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 作者&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author_email&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;your.email@example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 邮箱&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;This is a nir analyse api, written by zata&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="c1"># 简短描述&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;README.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;README.md&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description_content_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text/markdown&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 自动发现包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">packages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">find_packages&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 或手动指定包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># packages=[&amp;#34;nirapi&amp;#34;, &amp;#34;nirapi.AnalysisClass&amp;#34;],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 包含的数据文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">package_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;nirapi&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;*.txt&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;*.json&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;*.yaml&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="c1"># 包含特定文件类型&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 排除的文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exclude_package_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;.gitignore&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;*.pyc&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;__pycache__&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;nirapi&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;tests/*&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 依赖包&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">install_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;numpy&amp;gt;=1.19.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;pandas&amp;gt;=1.2.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 其他依赖...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Python版本要求&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">python_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;&amp;gt;=3.6&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 分类信息&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">classifiers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Development Status :: 3 - Alpha&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Intended Audience :: Developers&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;License :: OSI Approved :: MIT License&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.6&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.7&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="step-3-安装包">Step 3: 安装包
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 开发模式安装（推荐）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -e .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或正常安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 从其他位置安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install /path/to/your/package
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-验证安装">🔍 验证安装
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 测试导入&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">nirapi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nirapi&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">__version__&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">nirapi&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">utils&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="6-常见问题与解决方案">6. 常见问题与解决方案
&lt;/h2>&lt;h3 id="-安装与配置问题">❗ 安装与配置问题
&lt;/h3>&lt;h4 id="61-pip-忽略版本冲突">6.1 pip 忽略版本冲突
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 忽略依赖检查&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -r requirements.txt --no-dependencies
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 强制重新安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -r requirements.txt --force-reinstall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 跳过失败的包继续安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span> &lt;span class="nb">read&lt;/span> requirement&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pip install &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$requirement&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Failed to install &lt;/span>&lt;span class="nv">$requirement&lt;/span>&lt;span class="s2">, continuing...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span> &amp;lt; requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="62-conda-命令不可用">6.2 conda 命令不可用
&lt;/h4>&lt;p>&lt;strong>问题现象&lt;/strong>：安装后 &lt;code>conda --version&lt;/code> 提示命令不存在&lt;/p>
&lt;p>&lt;strong>解决步骤&lt;/strong>：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>验证安装位置&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 常见安装位置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls ~/miniconda3/bin/conda &lt;span class="c1"># 默认位置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls /opt/miniconda3/bin/conda &lt;span class="c1"># 容器环境常见位置&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>手动初始化&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 根据实际路径调整&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/opt/miniconda3/bin/conda init bash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>验证配置&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">conda --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image.png"
width="937"
height="656"
srcset="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu16371550383240315314.png 480w, https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/image_hu1412099588434290294.png 1024w"
loading="lazy"
alt="配置过程示例"
class="gallery-image"
data-flex-grow="142"
data-flex-basis="342px"
>&lt;/p>
&lt;h4 id="63-环境名称修改">6.3 环境名称修改
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法：克隆 + 删除原环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create --name new_env_name --clone old_env_name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env remove --name old_env_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-包管理问题">🐛 包管理问题
&lt;/h3>&lt;h4 id="64-pip-get_installed_distributions-报错">6.4 pip get_installed_distributions 报错
&lt;/h4>&lt;p>&lt;strong>问题&lt;/strong>：&lt;code>from pip._internal.utils.misc import get_installed_distributions&lt;/code> 报错&lt;/p>
&lt;p>&lt;strong>原因&lt;/strong>：pip 21.3+ 版本移除了该函数&lt;/p>
&lt;p>&lt;strong>解决方案&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 降级pip到21.2版本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install &lt;span class="nv">pip&lt;/span>&lt;span class="o">==&lt;/span>21.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或使用新的替代方案&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install importlib-metadata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="65-依赖文件生成">6.5 依赖文件生成
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法1：使用pip freeze（包含所有包）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip freeze &amp;gt; requirements.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法2：使用pipreqs（仅项目依赖，推荐）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install pipreqs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pipreqs ./ --force &lt;span class="c1"># --force 覆盖现有文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法3：手动筛选核心依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip freeze &lt;span class="p">|&lt;/span> grep -E &lt;span class="s2">&amp;#34;(numpy|pandas|requests)&amp;#34;&lt;/span> &amp;gt; requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-环境问题">🔧 环境问题
&lt;/h3>&lt;h4 id="66-虚拟环境激活失败">6.6 虚拟环境激活失败
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 检查虚拟环境路径&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls venv/bin/activate &lt;span class="c1"># Linux/Mac&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls venv&lt;span class="se">\S&lt;/span>cripts&lt;span class="se">\a&lt;/span>ctivate &lt;span class="c1"># Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重新创建虚拟环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rm -rf venv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">python -m venv venv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">source&lt;/span> venv/bin/activate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="67-包版本冲突">6.7 包版本冲突
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 查看包依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip show package_name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建干净环境重新安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n clean_env &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda activate clean_env
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install -r requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="7-conda-与-pip-区别对比">7. Conda 与 Pip 区别对比
&lt;/h2>&lt;h3 id="-详细对比表">📊 详细对比表
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>维度&lt;/th>
&lt;th>&lt;strong>conda install&lt;/strong>&lt;/th>
&lt;th>&lt;strong>pip install&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>包管理范围&lt;/strong>&lt;/td>
&lt;td>Python包 + 非Python依赖（C库、编译器等）&lt;/td>
&lt;td>仅Python包&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>环境管理&lt;/strong>&lt;/td>
&lt;td>与Conda环境紧密集成，强隔离&lt;/td>
&lt;td>需要额外配置虚拟环境&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>包来源&lt;/strong>&lt;/td>
&lt;td>Conda仓库（预编译，兼容性好）&lt;/td>
&lt;td>PyPI仓库（可能需要编译）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>依赖解决&lt;/strong>&lt;/td>
&lt;td>严格的依赖解析，优先整体兼容性&lt;/td>
&lt;td>相对宽松，可能出现版本冲突&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>安装速度&lt;/strong>&lt;/td>
&lt;td>较快（预编译包）&lt;/td>
&lt;td>可能较慢（需要编译）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>包数量&lt;/strong>&lt;/td>
&lt;td>相对较少但质量高&lt;/td>
&lt;td>包数量庞大&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>适用场景&lt;/strong>&lt;/td>
&lt;td>科学计算、数据科学、机器学习&lt;/td>
&lt;td>通用Python开发、Web开发&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>平台支持&lt;/strong>&lt;/td>
&lt;td>跨平台一致性好&lt;/td>
&lt;td>依赖系统环境&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="-使用建议">🎯 使用建议
&lt;/h3>&lt;h4 id="优先级策略">优先级策略
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 在Conda环境中优先使用conda&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install numpy pandas matplotlib
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. conda仓库没有的包使用pip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install some-special-package
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 避免混合使用导致冲突&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="最佳实践">最佳实践
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ✅ 推荐做法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n myproject &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda activate myproject
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install numpy pandas scikit-learn &lt;span class="c1"># 科学计算包用conda&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install flask &lt;span class="c1"># Web框架用pip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ❌ 避免做法&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install numpy &lt;span class="c1"># 在conda环境中用pip安装科学计算包&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-迁移建议">🔄 迁移建议
&lt;/h3>&lt;h4 id="从pip迁移到conda">从pip迁移到conda
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 创建conda环境&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda create -n new_env &lt;span class="nv">python&lt;/span>&lt;span class="o">=&lt;/span>3.8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 尝试用conda安装主要依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda install numpy pandas matplotlib
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 剩余包用pip安装&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install remaining-packages
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="环境同步">环境同步
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 导出完整环境（包括pip安装的包）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env &lt;span class="nb">export&lt;/span> &amp;gt; environment.yml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 在新环境中重建&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">conda env create -f environment.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;hr>
&lt;h2 id="8-将python包发布到github并通过pip安装">8. 将Python包发布到GitHub并通过pip安装
&lt;/h2>&lt;p>&lt;em>最后更新：2025-07-15&lt;/em>&lt;/p>
&lt;h3 id="-创建python包结构">📦 创建Python包结构
&lt;/h3>&lt;p>构建以下目录结构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">your_package/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── your_package/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── __init__.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── your_module.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── setup.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── README.md
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── LICENSE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-编写关键文件">📝 编写关键文件
&lt;/h3>&lt;h4 id="setuppy-示例">setup.py 示例：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">setuptools&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">setup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">find_packages&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;your_package_name&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">version&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;0.1.0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">packages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">find_packages&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">install_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;requests&amp;gt;=2.25.1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Your Name&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author_email&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;your.email@example.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;A short description of your package&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;README.md&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description_content_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;text/markdown&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;https://github.com/yourusername/your_package&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">classifiers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Programming Language :: Python :: 3&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;License :: OSI Approved :: MIT License&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="your_package__init__py">your_package/&lt;strong>init&lt;/strong>.py：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">__version__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;0.1.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-初始化git并上传到github">🚀 初始化Git并上传到GitHub
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git init
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git add .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git commit -m &lt;span class="s2">&amp;#34;Initial commit&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git remote add origin https://github.com/yourusername/your_package.git
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git branch -M main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push -u origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-创建github-release可选但推荐">🏷️ 创建GitHub Release（可选，但推荐）
&lt;/h3>&lt;ol>
&lt;li>访问GitHub仓库页面，点击&amp;quot;Releases&amp;quot; -&amp;gt; &amp;ldquo;Create a new release&amp;rdquo;&lt;/li>
&lt;li>输入版本号（如v0.1.0），发布&lt;/li>
&lt;/ol>
&lt;h3 id="-通过pip安装">📥 通过pip安装
&lt;/h3>&lt;h4 id="直接从github安装">直接从GitHub安装：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install git+https://github.com/yourusername/your_package.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="指定分支">指定分支：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install git+https://github.com/yourusername/your_package.git@branch_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="指定版本需要有release">指定版本（需要有release）：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install git+https://github.com/yourusername/your_package.git@v0.1.0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-发布到pypi可选允许标准pip安装">🌐 发布到PyPI（可选，允许标准pip安装）
&lt;/h3>&lt;h4 id="安装工具">安装工具：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install twine build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="构建包">构建包：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">python -m build
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="上传到pypi">上传到PyPI：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">twine upload dist/*
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="之后可使用">之后可使用：
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install your_package_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="-注意事项">⚠️ 注意事项
&lt;/h3>&lt;ul>
&lt;li>确保setup.py信息准确&lt;/li>
&lt;li>设置清晰的GitHub仓库描述和topics&lt;/li>
&lt;li>使用MIT或其他合适的许可证&lt;/li>
&lt;li>编写详细的README.md，包含安装和使用说明&lt;/li>
&lt;li>发布到PyPI需注册账号并配置API token&lt;/li>
&lt;/ul>
&lt;h3 id="-实际案例演示">🔧 实际案例演示
&lt;/h3>&lt;p>以我的包为例：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/github-package-structure.png"
width="1928"
height="2408"
srcset="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/github-package-structure_hu6535214450086741475.png 480w, https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/github-package-structure_hu5894236167466213233.png 1024w"
loading="lazy"
alt="GitHub包结构"
class="gallery-image"
data-flex-grow="80"
data-flex-basis="192px"
>&lt;/p>
&lt;p>首先，无需任何修改，直接尝试pip install（我将其改为public）：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/pip-install-failed.png"
width="2450"
height="952"
srcset="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/pip-install-failed_hu9511595062005165551.png 480w, https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/pip-install-failed_hu17572537783049973628.png 1024w"
loading="lazy"
alt="安装失败"
class="gallery-image"
data-flex-grow="257"
data-flex-basis="617px"
>&lt;/p>
&lt;p>然而安装失败了。&lt;/p>
&lt;p>将包发送给AI，AI帮助修改代码，包括创建nirapi目录，2个__init__.py文件，并修改setup.py：&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/ai-code-modification.png"
width="1992"
height="1890"
srcset="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/ai-code-modification_hu2445637597470465434.png 480w, https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/ai-code-modification_hu1170546717854375838.png 1024w"
loading="lazy"
alt="AI代码修改"
class="gallery-image"
data-flex-grow="105"
data-flex-basis="252px"
>&lt;/p>
&lt;p>推送到远程后，使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">uv pip install git+https://github.com/zata-zhangtao/API_FOR_NIR_ANALYSIS.git@test_pip_git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;img src="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/pip-install-success.png"
width="1540"
height="1962"
srcset="https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/pip-install-success_hu8031211196452141903.png 480w, https://www.zata.cc/p/conda%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bpip%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E4%BE%9D%E8%B5%96%E5%AE%89%E8%A3%85_%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/images/index/pip-install-success_hu16159921528858965317.png 1024w"
loading="lazy"
alt="安装成功"
class="gallery-image"
data-flex-grow="78"
data-flex-basis="188px"
>&lt;/p>
&lt;p>安装成功！&lt;/p>
&lt;p>让我们看看一些关键文件：&lt;/p>
&lt;h4 id="1-setuppy">1. setup.py
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># setup.py&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># coding=utf-8&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">setuptools&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">setup&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">find_packages&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Read the contents of README file&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="nb">open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;README.md&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;r&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">encoding&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">fh&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">fh&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">setup&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;nirapi&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">version&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;1.0.0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">author&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;zata&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;A Near-Infrared Spectroscopy Analysis API&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">long_description&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">long_description_content_type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;text/markdown&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">packages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">find_packages&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">package_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;nirapi&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;*.pkl&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="c1"># Include pickle files&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">include_package_data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">python_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&amp;gt;=3.8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">install_requires&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;numpy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pandas&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;scikit-learn&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;scipy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;matplotlib&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;seaborn&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;plotly&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;optuna&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pybaselines&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;xgboost&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;catboost&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;lightgbm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;obspy&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;tqdm&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;requests&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;pymysql&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;joblib&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">classifiers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Development Status :: 4 - Beta&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Intended Audience :: Science/Research&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;License :: OSI Approved :: MIT License&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Operating System :: OS Independent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.8&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.9&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.10&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Programming Language :: Python :: 3.11&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Topic :: Scientific/Engineering :: Chemistry&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Topic :: Scientific/Engineering :: Information Analysis&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">keywords&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;NIR spectroscopy analysis machine-learning&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="2-nirapi__init__py">2. nirapi/&lt;strong>init&lt;/strong>.py
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">NIR API - A Near-Infrared Spectroscopy Analysis Package
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">This package provides tools for Near-Infrared spectroscopy analysis including:
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- Data loading and preprocessing
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- Machine learning models
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- Visualization tools
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">- Analysis utilities
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__version__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;1.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__author__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;zata&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__description__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;A Near-Infrared Spectroscopy Analysis API&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Import main modules for easier access - only if dependencies are available&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">utils&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">load_data&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">preprocessing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">draw&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">analysis&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">ML_model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">featsec&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">model_class&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Make AnalysisClass available&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AnalysisClass&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">__all__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;utils&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;load_data&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;preprocessing&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;draw&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;analysis&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;ML_model&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;featsec&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;model_class&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;AnalysisClass&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">except&lt;/span> &lt;span class="ne">ImportError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># If dependencies are not available, provide a minimal interface&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">__all__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__getattr__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Lazy import for modules when dependencies are available.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">name&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;utils&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;load_data&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;preprocessing&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;draw&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;analysis&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;ML_model&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;featsec&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;model_class&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;AnalysisClass&amp;#39;&lt;/span>&lt;span class="p">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kn">import&lt;/span> &lt;span class="nn">importlib&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">module&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">importlib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">import_module&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;.&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="vm">__name__&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">module&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">ImportError&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">ImportError&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Module &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> requires additional dependencies: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">e&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">AttributeError&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;module &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="vm">__name__&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; has no attribute &amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3-nirapianalysisclass__init__py">3. nirapi/AnalysisClass/&lt;strong>init&lt;/strong>.py
&lt;/h4>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">AnalysisClass subpackage for NIR API
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">Contains specialized analysis classes for different NIR analysis tasks.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Create_rec_task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Create_train_task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">CreateTrainReport&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">.&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">DataAnalysisReport&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">__all__&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Create_rec_task&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Create_train_task&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;CreateTrainReport&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;DataAnalysisReport&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr></description></item><item><title>python程序打包exe使用教程</title><link>https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/</guid><description>&lt;img src="https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/image/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe.png" alt="Featured image of post python程序打包exe使用教程" />&lt;h2 id="目录">目录
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="#pystand" >Pystand&lt;/a>
&lt;ul>
&lt;li>&lt;a class="link" href="#%e9%97%ae%e9%a2%98%e5%92%8c%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9" >问题和注意事项&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#%e6%89%93%e5%8c%85%e6%95%99%e7%a8%8b" >打包教程&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a class="link" href="#pyinstaller%e6%89%93%e5%8c%85" >Pyinstaller打包&lt;/a>
&lt;ul>
&lt;li>&lt;a class="link" href="#%e6%89%93%e5%8c%85%e6%97%b6%e9%9c%80%e8%a6%81%e7%89%b9%e5%88%ab%e6%b3%a8%e6%84%8f%e7%9a%84%e6%ba%90%e7%a0%81%e7%bc%96%e5%86%99%e8%a7%84%e8%8c%83" >打包时需要特别注意的源码编写规范&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="#%e6%96%87%e4%bb%b6%e5%9c%b0%e5%9d%80%e5%a6%82%e4%bd%95%e5%bc%95%e7%94%a8" >文件地址如何引用&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a class="link" href="#%e6%89%93%e5%8c%85%e5%a5%bd%e7%9a%84exe-%e4%bd%bf%e7%94%a8%e6%97%b6%e4%bc%a0%e5%85%a5%e5%8f%82%e6%95%b0" >exe文件传入参数&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="pystand">Pystand
&lt;/h2>&lt;p>来源：
&lt;a class="link" href="https://www.zhihu.com/question/48776632/answer/2336654649" target="_blank" rel="noopener"
>https://www.zhihu.com/question/48776632/answer/2336654649&lt;/a>&lt;/p>
&lt;h3 id="问题和注意事项">问题和注意事项
&lt;/h3>&lt;ol>
&lt;li>python嵌入包的版本要和开发时候的版本一致&lt;/li>
&lt;/ol>
&lt;p>我因为开发版本是3.11，搞了一个3.10的python嵌入包而报错&lt;/p>
&lt;ol start="2">
&lt;li>精简代码组织&lt;/li>
&lt;/ol>
&lt;p>PyStand.int 仅作为入口，复杂逻辑放入 script 目录的 main.py 或其他模块，方便调试和维护。
路径配置：在 PyStand.int 中通过 sys.path.append 添加 script 或 script.egg 路径，确保模块可加载。&lt;/p>
&lt;h3 id="打包教程">打包教程
&lt;/h3>&lt;p>来源： &lt;a class="link" href="https://www.zhihu.com/question/48776632/answer/2336654649" target="_blank" rel="noopener"
>https://www.zhihu.com/question/48776632/answer/2336654649&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/images/index/image.png"
width="692"
height="14217"
srcset="https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/images/index/image_hu9533748217626684862.png 480w, https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/images/index/image_hu17793246432593882842.png 1024w"
loading="lazy"
alt="韦神的知乎回答"
class="gallery-image"
data-flex-grow="4"
data-flex-basis="11px"
>&lt;/p>
&lt;h2 id="pyinstaller打包">Pyinstaller打包
&lt;/h2>&lt;p>&lt;span style="color: red;">如果打包成无控制台模式，你使用你打包好的软件运行程序时可能不报任何print。&lt;/span>&lt;/p>
&lt;p>&lt;img src="https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/image/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe.jpg"
width="944"
height="4661"
srcset="https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/image/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe_hu29240194386566535.jpg 480w, https://www.zata.cc/p/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/image/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe/python%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85exe_hu18254994464503100918.jpg 1024w"
loading="lazy"
alt="alt text"
class="gallery-image"
data-flex-grow="20"
data-flex-basis="48px"
>&lt;/p>
&lt;h3 id="打包时需要特别注意的源码编写规范">打包时需要特别注意的源码编写规范
&lt;/h3>&lt;p>除了基本的 Python 编码规范之外,在准备程序进行打包时,还需要特别注意以下几点:&lt;/p>
&lt;h4 id="11-依赖管理">1.1 依赖管理
&lt;/h4>&lt;ul>
&lt;li>确保 &lt;code>requirements.txt&lt;/code> 文件中列出了程序所有的依赖库&lt;/li>
&lt;li>检查依赖库的版本兼容性,避免打包后出现兼容性问题&lt;/li>
&lt;li>尽可能使用 &lt;code>pip freeze &amp;gt; requirements.txt&lt;/code> 自动生成依赖列表&lt;/li>
&lt;/ul>
&lt;h4 id="12-动态导入处理">1.2 动态导入处理
&lt;/h4>&lt;ul>
&lt;li>程序中如果使用了动态导入,需要确保 PyInstaller 能够正确识别并打包&lt;/li>
&lt;li>可以使用 &lt;code>PyInstaller --hiddenimport&lt;/code> 选项手动指定隐藏依赖&lt;/li>
&lt;/ul>
&lt;h4 id="13-平台兼容性">1.3 平台兼容性
&lt;/h4>&lt;ul>
&lt;li>如果程序需要跨平台运行,需要确保代码本身具有良好的跨平台兼容性&lt;/li>
&lt;li>针对不同平台,可能需要使用条件编译或运行时检测来适配&lt;/li>
&lt;/ul>
&lt;h4 id="14-文件路径处理">1.4 文件路径处理
&lt;/h4>&lt;ul>
&lt;li>程序中涉及文件读写操作时,需要注意处理相对路径和绝对路径&lt;/li>
&lt;li>打包后的程序文件结构可能与开发环境不同,需要适当调整路径&lt;/li>
&lt;/ul>
&lt;h4 id="15-图形界面兼容性">1.5 图形界面兼容性
&lt;/h4>&lt;ul>
&lt;li>如果程序有图形界面,需要确保界面组件在打包后能正常工作&lt;/li>
&lt;li>可能需要额外打包一些 GUI 库的依赖项&lt;/li>
&lt;/ul>
&lt;h4 id="16-第三方库限制">1.6 第三方库限制
&lt;/h4>&lt;ul>
&lt;li>某些第三方库可能不支持 PyInstaller 打包,需要提前了解并做好替代方案&lt;/li>
&lt;li>对于不支持的库,可以考虑使用纯 Python 实现或寻找替代方案&lt;/li>
&lt;/ul>
&lt;h4 id="17-运行时环境">1.7 运行时环境
&lt;/h4>&lt;ul>
&lt;li>确保程序在打包后的运行环境下能正常工作,例如环境变量、系统依赖等&lt;/li>
&lt;/ul>
&lt;h3 id="目录结构">目录结构
&lt;/h3>&lt;p>典型的目录结构
project_name/
├── src/
│ ├── &lt;strong>init&lt;/strong>.py
│ └── main.py
├── tests/
│ ├── &lt;strong>init&lt;/strong>.py
│ └── test_main.py
├── resources/
│ ├── config.ini
│ └── images/
├── requirements.txt
├── setup.py
└── README.md&lt;/p>
&lt;h3 id="文件地址如何引用">文件地址如何引用
&lt;/h3>&lt;p>如果项目中使用到了文件&lt;/p>
&lt;h4 id="相对导入">相对导入
&lt;/h4>&lt;p>在同一个包内部,可以使用相对导入的方式引用其他模块。
pythonCopyfrom . import some_module
from .subpackage import another_module&lt;/p>
&lt;h4 id="绝对导入">绝对导入
&lt;/h4>&lt;p>跨包引用时,需要使用绝对导入的方式。
pythonCopyfrom project_name.modules import some_module
from project_name.subpackage import another_module&lt;/p>
&lt;h4 id="注意事项">注意事项
&lt;/h4>&lt;p>避免循环导入问题,可以使用 &lt;strong>main&lt;/strong> 进行条件导入。
保持导入语句的位置在文件顶部。
优先使用绝对导入,相对导入仅在同一包内部使用。&lt;/p>
&lt;h3 id="打包成一个文件">打包成一个文件
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller -F main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="打包成多个文件软件启动速度会快点">打包成多个文件（软件启动速度会快点）
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller -D main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="无控制台打包多文件">无控制台打包，多文件
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller -D -w main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="其他参数">其他参数
&lt;/h3>&lt;p>我来为您介绍 PyInstaller 的常用打包参数：&lt;/p>
&lt;p>主要参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">-F, --onefile 打包成一个独立的可执行文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-D, --onedir 打包成一个文件夹(默认选项)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-w, --windowed 不显示命令行窗口(Windows系统)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-c, --console 显示命令行窗口(默认,Windows系统)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-n NAME 指定生成的可执行文件名
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--clean 在构建之前清理临时文件
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常用可选参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">--icon=&amp;lt;FILE.ico&amp;gt; 指定可执行文件的图标
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--add-data 添加额外的数据文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--add-binary 添加额外的二进制文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--paths 添加导入路径
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--hidden-import 添加隐式导入的模块
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--exclude-module 排除指定模块
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>高级参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">--runtime-hook 指定运行时钩子脚本
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--additional-hooks-dir 指定额外的钩子脚本目录
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--version-file 指定版本文件
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--manifest 指定manifest文件(Windows)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--upx-dir 指定UPX压缩工具目录
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">--noupx 禁用UPX压缩
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包成单个可执行文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F main.py
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包成单个文件并指定图标&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F main.py --icon&lt;span class="o">=&lt;/span>app.ico
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包时添加数据文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -F main.py --add-data &lt;span class="s2">&amp;#34;data:data&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 打包成文件夹并不显示控制台&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pyinstaller -D -w main.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="使用配置文件spec打包">使用配置文件.spec打包
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pyinstaller your_project.spec
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="打包好的exe-使用时传入参数">打包好的exe 使用时传入参数
&lt;/h2>&lt;p>在开发桌面应用程序时,经常需要在打包为可执行文件(EXE)后,能够向它传递参数,以实现不同的功能。下面就讲解如何在将 Python 脚本打包为 EXE 文件后,仍然可以向其传递参数。
&lt;img src="https://i-blog.csdnimg.cn/direct/032785fd696e4d7c8e612876118bd46e.gif"
loading="lazy"
alt="在这里插入图片描述"
>&lt;/p>
&lt;h3 id="1-准备工作">1. 准备工作
&lt;/h3>&lt;p>首先,我们需要有一个简单的 Python 脚本,用于演示如何传递参数。假设我们有一个名为 &lt;code>main.py&lt;/code> 的文件,内容如下:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;__main__&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">arg1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sys&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">argv&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Argument passed: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">arg1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;No arguments passed.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个脚本会检查命令行参数的数量,如果有参数传递,就会打印出第一个参数的值。&lt;/p>
&lt;p>接下来,我们需要使用 PyInstaller 将这个 Python 脚本打包为可执行文件(EXE)。为此,我们创建一个名为 &lt;code>ExePack.py&lt;/code> 的文件,内容如下:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">PyInstaller.__main__&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">shutil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">PyInstaller&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">__main__&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;main.py&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;--onefile&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;--name=MyApp&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;--distpath=dist&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;--workpath=build&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;--specpath=.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;--noconsole&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除 build 文件夹&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">shutil&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">rmtree&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;build&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ignore_errors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 删除 .spec 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">remove&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;MyApp.spec&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个脚本使用 PyInstaller 将 &lt;code>main.py&lt;/code> 打包为一个名为 &lt;code>MyApp.exe&lt;/code> 的可执行文件,并输出到 &lt;code>dist&lt;/code> 文件夹。&lt;/p>
&lt;h3 id="2-传递参数">2. 传递参数
&lt;/h3>&lt;p>现在,我们需要编写一个脚本,用于运行打包好的 EXE 文件并传递参数。创建一个名为 &lt;code>args2exe.py&lt;/code> 的文件,内容如下:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">subprocess&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">run_exe_with_args&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">exe_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;运行 exe 文件并传入参数&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exists&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">exe_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;文件不存在: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">exe_path&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">command&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">exe_path&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">subprocess&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">command&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">capture_output&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;标准输出:&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">stdout&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;__main__&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exe_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;dist&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;MyApp.exe&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">run_exe_with_args&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">exe_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;参数1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;参数2&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个脚本定义了一个 &lt;code>run_exe_with_args&lt;/code> 函数,用于运行打包好的 EXE 文件并传递参数。在 &lt;code>if __name__ == '__main__'&lt;/code> 部分,我们调用这个函数,传递 &lt;code>'参数1'&lt;/code> 和 &lt;code>'参数2'&lt;/code> 作为参数。&lt;/p>
&lt;h3 id="3-运行">3. 运行
&lt;/h3>&lt;ol>
&lt;li>首先,运行 &lt;code>ExePack.py&lt;/code> 脚本,将 &lt;code>main.py&lt;/code> 打包为 &lt;code>MyApp.exe&lt;/code> 可执行文件。&lt;/li>
&lt;li>然后,运行 &lt;code>args2exe.py&lt;/code> 脚本。这将启动 &lt;code>MyApp.exe&lt;/code> 并传递参数 &lt;code>'参数1'&lt;/code> 和 &lt;code>'参数2'&lt;/code>。&lt;/li>
&lt;/ol>
&lt;p>在控制台上,你应该能看到以下输出:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Argument passed: 参数1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是在打包好的 EXE 文件中传递参数的方法。通过使用 &lt;code>subprocess&lt;/code> 模块,我们可以运行 EXE 文件并向其传递参数,从而实现更灵活的应用程序功能。&lt;/p></description></item></channel></rss>