链接:https://blog.youkuaiyun.com/kevindree/article/details/88711195
看了一些文章,介绍pyinstaller作为一个第三方库,可以将python脚本打包成可执行程序,依葫芦画瓢,开始操作。
首先当然是下载,安装。
- pip install pyinstaller
- # 或者
- python -m pip install pyinstaller
非常顺利,成功执行。
然后为了生成一个单一的exe执行程序,采用参数-F进行打包,命令如下:
pyinstaller -F myscript.py
我所使用的方法!!!!没有使用-F生成一个单独的exe,而是(pyinstaller myscript.py)生成一个文件夹,测试成功
执行成功,进入dist目录,看到可执行程序,非常高兴。但是在cmd窗口中执行,发现报错
- Traceback (most recent call last):
- File "math.py", line 1, in <module>
- 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 <module>
- 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 <module>
- File "numpy\ctypeslib.py", line 358, in _get_typecodes
- File "numpy\ctypeslib.py", line 358, in <dictcomp>
- 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 表示可执行文件的图标。