本文所讲仅为独立的项目文件夹下如何进行打包,不涉及存在依赖关系的多个文件夹共同打包。
项目结构示例
D:/└── myproject└── my_project├── main.py├── module1.py└── other_files...
- 项目文件夹:
my_project
- 主程序文件:
main.py
- 其他自定义模块:如
module1.py
、module2.py
… - 其他资源文件(如图片、配置文件等):放在
images
、configs
文件夹中
一. 安装PyInstaller
在命令行中运行以下命令,安装软件包
pip install pyinstaller
二. 资源文件处理
在打包后的可执行文件中,资源文件的路径可能会发生变化。如果项目中有资源文件(如my_project/images
和my_project/configs
中的文件),为了确保在程序中正确引用这些资源文件的路径。
使用sys._MEIPASS
(这是PyInstaller创建的一个临时文件夹路径,用于存放资源文件)来获取正确的路径。例如,在main.py
中可以这样处理资源文件路径:
import sys
import osdef resource_path(relative_path):"""获取资源文件的绝对路径"""try:base_path = sys._MEIPASSexcept Exception:base_path = os.path.abspath(".")return os.path.join(base_path, relative_path)
当引用资源文件(如图片文件image.jpg
在images
文件夹中)时,可以使用resource_path("images/image.jpg")
来获取正确的路径。
三. 检查程序入口
在主程序文件(如main.py
)中,应该包含程序的初始逻辑,例如:初始化窗口(如果是图形界面程序)、加载配置文件、启动主要的业务流程等。要确保程序的主要功能和流程是从这个文件开始触发的。如果有多个Python文件,其他文件中的函数和类应该是被主程序文件调用的。例如,main.py
可能会导入module1.py
中的函数并调用它们来实现具体的功能,例如:
from module1 import function1def main():function1()# 其他主程序逻辑if __name__ == "__main__":main()
这样,当打包后的可执行文件运行时,就会从main.py
的if __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 环境的机器上直接运行。