如何将 Python 编译器打包并添加自定义模块?
看到这个项目 https://github.com/phuslu/pybuild
可以把编译器直接打包,这样就非常方便把脚本打包给别人玩了。
但可惜的是只有 2.7 版本的,没有 python3 的。
所以,我想自己搞 python3 的,并且安装加入自己需要的模块,比如 requests,qt
应该怎么操作?
如何将 Python 编译器打包并添加自定义模块?
pyinstaller
这个问题有点模糊,我猜你想问的是如何将你的Python脚本(包含自定义模块)打包成一个独立的可执行文件(exe),这样在没有安装Python环境的电脑上也能运行。
最常用的工具是 PyInstaller。下面是一个完整的操作示例。
假设你的项目结构如下:
my_project/
├── main.py # 主程序入口
├── my_module/ # 你的自定义包
│ ├── __init__.py
│ └── utils.py
└── config.json # 其他资源文件
1. 安装 PyInstaller
pip install pyinstaller
2. 创建 spec 文件(可选但推荐用于复杂项目) 在项目根目录运行,生成一个模板配置文件:
pyinstaller --name MyApp --onedir main.py
这会生成一个 MyApp.spec 文件。
3. 编辑 spec 文件以包含自定义模块和资源
用文本编辑器打开 MyApp.spec,主要修改 Analysis 部分:
# MyApp.spec
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[('config.json', '.'), ('my_module', 'my_module')], # 添加数据文件和自定义包
hiddenimports=[], # 如果PyInstaller没自动捕获某些隐式导入,在这里添加
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
datas: 将非.py文件(如图片、配置文件)和整个包目录打包进去。格式是(源路径, 目标文件夹)。
4. 使用 spec 文件进行打包
pyinstaller MyApp.spec
或者,如果你不需要spec文件,想一步到位,可以使用命令行直接指定:
pyinstaller --name MyApp --onedir --add-data "config.json;." --add-data "my_module;my_module" main.py
--onedir: 生成一个文件夹(包含所有依赖),分发方便但文件多。- 使用
--onefile则生成单个exe,启动稍慢。
5. 查找输出
完成后,在 dist/ 目录下找到你的可执行文件或文件夹。整个 dist/MyApp/ 文件夹就是你可以分发的“打包好的程序”。
关键点:确保你的代码中引用资源文件(如config.json)时使用 sys._MEIPASS 来获取临时解压路径。例如:
import sys
import os
def get_resource_path(relative_path):
""" 获取资源的绝对路径,兼容开发模式和PyInstaller打包后模式 """
try:
# PyInstaller创建的临时文件夹路径
base_path = sys._MEIPASS
except AttributeError:
# 正常开发模式下的路径
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
config_path = get_resource_path('config.json')
一句话总结:用PyInstaller,通过编辑spec文件或命令行参数 --add-data 来包含你的自定义模块和资源文件。
这个项目看了 基本就是 py2exe, 这个包本身是支持 py3
http://www.py2exe.org/index.cgi/Tutorial#Step52
#2 官网看了下只有 2.7 的
跟 pypi 上的是一样的吧 https://pypi.python.org/pypi/py2exe/
pyinstaller,不过似乎有不少坑
#4 我就是用 pyinstaller 打包一直报缺失各种文件, 躺不平才转向直接打包编译器
遇到的坑 :
1. 官网的 py2exe 只有 py2.7 版,所以转向 pypi 上的 py2exe;
2. pypi 上的 py2exe 只有 py3.4 版,安装了 py3.4 版本后,发现最新版的 QT 只支持 py3.5 以上。。。
3. 还有 pywin32 等等各种坑 。。
也可以试试 cx_freeze,我用 pyinstaller 打包运行不成功的就会试试 cx_freeze,可能会成功的…不过 cx_freeze 不支持 onefile 模式

