pyinstaller是一個非常簡單的打包python的py文件的庫,
把py文件打包成exe文件,方便給小白執行程序。
官網介紹 http://www.pyinstaller.org/
安裝
pip install pyinstaller
使用PyInstaller生成exe文件
Pyinstaller -F -w -i tk_down.ico test_gui.py
其中tk_down.ico 為圖標文件
-F 表示生成單個可執行文件
-w 表示去掉控制台窗口,這在GUI界面時非常有用。
-i 表示可執行文件的圖標
舉例:
(v1) C:\Users\spyider>Pyinstaller -F -w -i tk_down.ico test_gui.py 1788 INFO: PyInstaller: 4.5.1 1789 INFO: Python: 3.6.4 (conda) 1790 INFO: Platform: Windows-7-6.1.7601-SP1 1792 INFO: wrote C:\Users\china\pord_spyider\test_gui.spec 1796 INFO: UPX is not available. 1798 INFO: Extending PYTHONPATH with paths ['C:\\Users\\spyider', 'C:\\Users\\spyider'] 2315 INFO: checking Analysis 2393 INFO: checking PYZ 2419 INFO: checking PKG 2420 INFO: Building because toc changed 2421 INFO: Building PKG (CArchive) PKG-00.pkg 6012 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 6052 INFO: Bootltestder c:\programdata\anaconda3\lib\site-packages\PyInstaller\boo tltestder\Windows-32bit\runw.exe 6053 INFO: checking EXE 6054 INFO: Rebuilding EXE-00.toc because test_gui.exe missing 6055 INFO: Building EXE from EXE-00.toc 6058 INFO: Copying icons from ['tk_down.ico'] 6069 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes 6069 INFO: Writing RT_ICON 1 resource with 67624 bytes 6075 INFO: Updating manifest in C:\Users\china\pord_spyider\build\test_gui\runw.ex e.on_gk_di 6083 INFO: Updating resource type 24 name 1 language 0 6088 INFO: Appending archive to EXE C:\Users\spyider\dist\test_gui.exe 11275 INFO: Building EXE from EXE-00.toc completed successfully.
錯誤解決
File "c:\programdata\anaconda3\envs\v1\lib\site-packages\PyInstaller\hooks\hook-distutils.py", l hiddenimports = [sysconfig._get_sysconfigdata_name()] TypeError: _get_sysconfigdata_name() missing 1 required positional argument: 'check_exists'
首先,轉到python交互式shell,做
$ python >> import sysconfig >> print(sysconfig.__file__)
這應該為您提供文件所在的位置sysconfig。然后你需要去那個文件並編輯源代碼,
修改了check_exists= True
源文件修改后
def _get_sysconfigdata_name(check_exists= True): res = os.environ.get('_PYTHON_SYSCONFIGDATA_NAME', None) if res and check_exists: try: loader = importlib.util.find_spec(res) except: res = None if res: return res return '_sysconfigdata_{abi}_{platform}_{multiarch}'.format( abi=sys.abiflags, platform=sys.platform, multiarch=getattr(sys.implementation, '_multiarch', ''))