Pyinstaller打包


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', ''))