看了一些文章,介绍pyinstaller作为一个第三方库,可以将python脚本打包成可执行程序,依葫芦画瓢,开始操作。
首先当然是下载,安装。
pip install pyinstaller
# 或者
python -m pip install pyinstaller
非常顺利,成功执行。
然后为了生成一个单一的exe执行程序,采用参数-F进行打包,命令如下:
pyinstaller -F myscript.py
执行成功,进入dist目录,看到可执行程序,非常高兴。但是在cmd窗口中执行,发现报错
Traceback (most recent call last):
File "math.py", line 1, in
File "c:\users\pc\appdata\local\programs\python\python36\lib\site-packages\PyI
nstaller\loader\pyimod03_importers.py", line 627, in exec_module
exec(bytecode, module.__dict__)
File "numpy\__init__.py", line 151, in
File "c:\users\pc\appdata\local\programs\python\python36\lib\site-packages\PyI
nstaller\loader\pyimod03_importers.py", line 627, in exec_module
exec(bytecode, module.__dict__)
File "numpy\ctypeslib.py", line 369, in
File "numpy\ctypeslib.py", line 358, in _get_typecodes
File "numpy\ctypeslib.py", line 358, in
ModuleNotFoundError: No module named 'numpy.core._dtype_ctypes'
[14572] Failed to execute script myscript
通过在网上搜索,找到了解决办法:需要手工修改编译时生成的myscript.spec文件,把无法加载的库,放到hiddenimports=里面。修改后的文件内容如下:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['math.py'],
pathex=['D:\\MyPythonWorkspaces\\Jason_python'],
binaries=[],
datas=[],
hiddenimports=['numpy.core._dtype_ctypes'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='myscript',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
修改并保存这个spec文件后,再执行如下命令:
pyinstaller myscript.spec
执行成功,再次在cmd窗口中执行程序,运行正常!
pyinstaller的各主要参数说明
-F 表示生成单个可执行文件;
-D –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。
-w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!;
-c –console, –nowindowed 使用控制台,无界面(默认);
-p 表示你自己自定义需要加载的类路径,一般情况下用不到;
-i 表示可执行文件的图标。