在Python中,将项目打包成可执行的exe文件是一个常见的任务,尤其是在需要分发应用程序给没有安装Python环境的用户时。下面是几种主流的方式及其参数的含义和使用案例。推介使用Pyinstaller和Nuitka,前者最常用,后者打包后防止反编译,且软件小执行快。
PyInstaller
PyInstaller是打包Python程序最流行的工具之一,它可以生成独立可执行的程序。
参数及其作用
打包类型:
-F
,--onefile
:生成单个可执行文件。-D
,--onedir
:生成包含多个文件的可执行目录(默认选项)。-w
,--windowed
:不显示控制台窗口(对于GUI应用)。-c
,--console
:显示控制台窗口(默认选项,对于命令行应用)。--service
:生成Windows服务程序。
可执行文件名和图标:
-n
,--name
:指定生成可执行文件的名称。-i
,--icon
:指定可执行文件的图标。
资源文件和数据文件:
--add-data
:添加非Python文件到可执行文件中(格式:<SRC;DEST or SRC:DEST>
)。--hidden-import
:包括PyInstaller可能检测不到的隐藏导入。--add-binary
:添加二进制文件。--add-resource
:添加资源文件。
优化和压缩:
--upx
:使用UPX压缩可执行文件(如果已安装UPX)。--noupx
:不使用UPX压缩可执行文件。
清理和调试:
--clean
:在打包之前清除缓存和临时文件。--log-level
:设置日志级别(DEBUG, INFO, WARN, ERROR, CRITICAL)。
其他:
--runtime-tmpdir
:指定运行时临时文件的目录。--version-file
:指定包含版本信息的文件。--strip
:去除二进制文件中的符号信息。
pyinstaller打包时的加密
通过修改spec
文件,添加运行时选项来增强安全性。虽然PyInstaller
本身不直接支持加密功能,但你可以通过以下方式修改spec
文件:
# 在spec文件中添加以下内容
# hooks/hook-encodings.py 是一个示例,具体情况可能需要根据你使用的库进行修改
a = Analysis(['your_script.py'],
pathex=['path_to_your_script'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=['hooks/hook-encodings.py'], # 添加你的运行时钩子
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=1, # 这将启用加密.pyc文件的功能(需要使用--key参数)
noarchive=False)
使用--key
参数给PyInstaller命令行提供一个密钥来加密.pyc
文件:
pyinstaller --key your_secret_key your_script.py
使用案例:
pyinstaller -F myscript.py --icon=icon.ico --add-data 'src;dest' --hidden-import=module.name
cx_Freeze
cx_Freeze是另一个流行的打包工具,它将Python脚本转换为可执行文件。
参数及其作用
-c
:创建压缩的可执行文件。-o
:指定输出目录。-r
:包含的额外运行时文件。-s
:不包含独立的Python解释器。--include-modules
:包括额外的模块。--exclude-modules
:排除某些模块。
使用案例:
cxfreeze myscript.py --icon=icon.ico --include-modules=module1,module2 --exclude-modules=module3
py2exe
py2exe
是一个用于Windows平台的打包工具。
参数及其作用:
--dist-dir
:指定生成的可执行文件的目录。--icon
:指定图标文件。--includes
:包括额外的模块。--excludes
:排除某些模块。
使用案例:
python setup.py py2exe --dist-dir=.\dist --icon=icon.ico --includes=module1,module2
Nuitka
Nuitka
是一个将Python代码转换为C语言然后编译成可执行文件的工具。
参数及其作用:
-o
或--output-dir
-
描述:指定输出目录,用于存储生成的可执行文件和其他相关文件。
-
示例:
nuitka --output-dir=/path/to/output myscript.py
--file-reference-choice
-
描述:控制用于引用包含在输出文件夹中的文件的策略。
-
示例:
nuitka --file-reference-choice=runtime myscript.py
-s
或--standalone
-
描述:创建一个完全独立的可执行文件,包含所有依赖的库。
-
示例:
nuitka --standalone myscript.py
--recurse-none
-
描述:不递归包含任何模块,除非明确指定。
-
示例:
nuitka --recurse-none myscript.py
--recurse-all
-
描述:递归包含所有用到的模块。
-
示例:
nuitka --recurse-all myscript.py
--recurse-to
-
描述:递归包含指定的模块及其依赖。
-
示例:
nuitka --recurse-to=module1,module2 myscript.py
--recurse-not-to
-
描述:明确不递归包含指定的模块。
-
示例:
nuitka --recurse-not-to=module1,module2 myscript.py
--include-plugin-directory
-
描述:包含指定的插件目录。
-
示例:
nuitka --include-plugin-directory=/path/to/plugin myscript.py
--include-package
-
描述:包含指定的包。
-
示例:
nuitka --include-package=package1,package2 myscript.py
--include-module
-
描述:包含指定的模块。
-
示例:
nuitka --include-module=module1,module2 myscript.py
--nofollow-imports
-
描述:不遵循import语句。
-
示例:
nuitka --nofollow-imports myscript.py
--plugin-enable
-
描述:启用指定的插件。
-
示例:
nuitka --plugin-enable=plugin_name myscript.py
--plugin-disable
-
描述:禁用指定的插件。
-
示例:
nuitka --plugin-disable=plugin_name myscript.py
--windows-icon
-
描述:为Windows可执行文件指定图标。
-
示例:
nuitka --windows-icon=/path/to/icon.ico myscript.py
--linux-icon
-
描述:为Linux可执行文件指定图标。
-
示例:
nuitka --linux-icon=/path/to/icon.png myscript.py
--macos-icon
-
描述:为macOS可执行文件指定图标。
-
示例:
nuitka --macos-icon=/path/to/icon.icns myscript.py
-v
或--verbose
-
描述:输出详细信息。
-
示例:
nuitka -v myscript.py
--show-memory
-
描述:显示内存使用情况。
-
示例:
nuitka --show-memory myscript.py
--show-progress
-
描述:显示编译进度。
-
示例:
nuitka --show-progress myscript.py
使用案例:
nuitka --standalone --output-dir=.\dist myscript.py --recurse-all
评论区