Python:使用PyInstaller打包

本文所讲仅为独立的项目文件夹下如何进行打包,不涉及存在依赖关系的多个文件夹共同打包。

项目结构示例

    D:/
	└── myproject
	    └── my_project
	        ├── main.py
	        ├── module1.py
	        └── other_files...
  • 项目文件夹:my_project
  • 主程序文件:main.py
  • 其他自定义模块:如module1.pymodule2.py
  • 其他资源文件(如图片、配置文件等):放在imagesconfigs文件夹中
  • 一. 安装PyInstaller

    在命令行中运行以下命令,安装软件包

    pip install pyinstaller
    

    二. 资源文件处理

    在打包后的可执行文件中,资源文件的路径可能会发生变化。如果项目中有资源文件(如my_project/imagesmy_project/configs中的文件),为了确保在程序中正确引用这些资源文件的路径。
    使用sys._MEIPASS(这是PyInstaller创建的一个临时文件夹路径,用于存放资源文件)来获取正确的路径。例如,在main.py中可以这样处理资源文件路径:

    import sys
    import os
    
    def resource_path(relative_path):
        """获取资源文件的绝对路径"""
        try:
            base_path = sys._MEIPASS
        except Exception:
            base_path = os.path.abspath(".")
        return os.path.join(base_path, relative_path)
    

    当引用资源文件(如图片文件image.jpgimages文件夹中)时,可以使用resource_path("images/image.jpg")来获取正确的路径。

    三. 检查程序入口

    在主程序文件(如main.py)中,应该包含程序的初始逻辑,例如:初始化窗口(如果是图形界面程序)、加载配置文件、启动主要的业务流程等。要确保程序的主要功能和流程是从这个文件开始触发的。如果有多个Python文件,其他文件中的函数和类应该是被主程序文件调用的。例如,main.py可能会导入module1.py中的函数并调用它们来实现具体的功能,例如:

    from module1 import function1
    
    def main():
        function1()
        # 其他主程序逻辑
    
    if __name__ == "__main__":
        main()
    

    这样,当打包后的可执行文件运行时,就会从main.pyif __name__ == "__main__"部分开始执行,调用main函数,进而调用其他模块中的函数来实现完整的程序功能。

    三. 打包

    (一)打包整个文件夹

    在命令行中进入my_project文件夹的上级目录(示例中为D:/),然后运行:

    pyinstaller -F -p my_project my_project/main.py`。
    
  • -F参数表示生成单个可执行文件。
  • -p参数用于指定Python模块搜索路径,这里将项目文件夹my_project添加到搜索路径中,这样PyInstaller才能找到所有相关的模块。
  • my_project/main.py指定了主程序文件的路径。
  • (二)打包单个py文件

    如果只有一个py文件需要打包,可使用此方式直接打包。

    方法一
    在命令行中进入包含 Python 脚本的目录(示例中为D:/my_project),执行:

    pyinstaller --onefile module1.py
    
  • --onefile表示将所有文件打包成一个独立的可执行文件。
  • module1.py是要打包的 Python 脚本文件名。
  • 方法二
    通过--distpath参数指定生成的可执行文件存放路径(不指定时,存放在py文件路径下)

    pyinstaller --onefile --distpath D:/my_project module1.py
    

    这样生成的可执行文件就会存放在D:/my_project文件夹中。

    打包后会在dist文件夹中生成对应的可执行文件,可将其拷贝到其他无 Python 环境的机器上直接运行。

    作者:Faylynn

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python:使用PyInstaller打包

    发表回复