如何将 Python 编译器打包并添加自定义模块?

看到这个项目 https://github.com/phuslu/pybuild
可以把编译器直接打包,这样就非常方便把脚本打包给别人玩了。

但可惜的是只有 2.7 版本的,没有 python3 的。

所以,我想自己搞 python3 的,并且安装加入自己需要的模块,比如 requests,qt

应该怎么操作?
如何将 Python 编译器打包并添加自定义模块?

8 回复

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 模式

回到顶部