<?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/tags/%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83/</link><description>Recent content in 打包发布 on 扎塔-Zata</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>扎塔-Zata</copyright><lastBuildDate>Thu, 24 Sep 2026 17:09:06 +0800</lastBuildDate><atom:link href="https://www.zata.cc/tags/%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83/index.xml" rel="self" type="application/rss+xml"/><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>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>