记录一次pyinstaller的坎坷经历

我的天,太坎坷了。
pychon 37-32 pycharm编译遇到的几个坑
1、设置虚拟环境可以使用国内镜像,

http://mirrors.aliyun.com/pypi/simple/

设置C:\Users\用户名\pip文件夹增加pip.ini格式如下

[golbal]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

2、使用pyinstaller中遇到任何编译问题及错误记得用python XXX.py进行调试(百度很多坑)
3、使用pyinstaller打包前必须经过调试找到问题,有时候使用python xxx.py能编译,但是独立编译就出错,一般是没打包完全,不管是撒,继续找问题:

首先将.py文件打包成命令行 pyinstaller -c xxx.py

然后利用控制台进入命令行文件夹cd xxx,然后在文件夹命令行内运行xxx.exe看输出

File “xxx.py”, line 2, in
ModuleNotFoundError: No module named ‘PyQt5’

找到问题,直接带入pyinstaller -F xxx.py --hidden-import PyQt5.sip
补充错误:
1、

python -m pip install --upgrade pip --force-reinstall

如果出现:

failed to create process.

则:

python -m pip install --upgrade pip --force-reinstall

python -m pip install --upgrade pyinstaller --force-reinstall

2、命令行升级:

pip install --upgrade pyinstaller

3、安装开发者版本:

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz

4、升级pip install –upgrade setuptools、升级PIP
打包出现:WARNING: Hidden import “sip” not found!
则:

pip install sip -i http://mirrors.aliyun.com/pypi/simple/

5、关于python36与python37之间版本的切换、
注意了:只要进入对应版本的文件夹即可!!!!!就是这么简单。
6、运行python.exe提示VCRUNTIME140.dll 缺失 解决办法
如果有用upx压缩请停止,版本不同,或者upx压缩错误, --noupx命令。
也有可能如下解决:

pyinstaller --clean --win-private-assemblies -F XXXX.py

–clean清除pyinstaller的缓存并移除之前建立的临时文件,

–win-私人组件把跟这个程序捆绑的共享的组件都改为私有的

调试阶段不用-w,因为如果有错误就打印在终端了而不是闪退

我的天@!这个问题困扰了很久也解决了。
如果需要打包dll,直接修改spen文件,配置如下:
编辑spec文件添加第三方DLL。例如xxx.py模块用到的DLL,按如下格式编辑xxx.spec文件的datas=[]参数;

datas=[(‘xx.dll’,’.’),(‘xx.dll’,’.’)]

编辑spec文件添加图标文件。提前准备图标文件,例如:xx.ico,在exe = EXE()中添加 icon=‘xx.ico’ 参数,如下:

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='test',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,

          console=True , icon='xx.ico')

范本spen:带dll带上了PyQt5.sip

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['xxx.py'],
             pathex=['E:\\LSW\\2\\qrcode'],
             binaries=[],
             datas=[('libiconv-2.dll','.'),('libzbar-32.dll','.')],
             hiddenimports=['PyQt5.sip'],
             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='xxx',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False )

最后:
利用upx命令压缩exe。下载对应版本的upx工具包解压到任意目录下,执行命令
另一种直接解压后复制upx.exe到python目录下,然后直接编辑spec文件的upx为False
pyinstaller -F xxx.spec --upx upx路径
UPX
搞定!!!

补充:

 ImportError: unable to find Qt5Core.dll on PATH

则Fix PyQt5

Save this code snip to a file named fix_qt_import_error.py, then add the line import fix_qt_import_error to your files that need to import PyQt5

# Fix qt import error
# Include this file before import PyQt5 

import os
import sys
import logging


def _append_run_path():
    if getattr(sys, 'frozen', False):
        pathlist = []

        # If the application is run as a bundle, the pyInstaller bootloader
        # extends the sys module by a flag frozen=True and sets the app
        # path into variable _MEIPASS'.
        pathlist.append(sys._MEIPASS)

        # the application exe path
        _main_app_path = os.path.dirname(sys.executable)
        pathlist.append(_main_app_path)

        # append to system path enviroment
        os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)

    logging.error("current PATH: %s", os.environ['PATH'])


_append_run_path()



奇葩问题:

pycharm中import导入包呈现灰色问题之解决!
问题描述:pycharm中单个py文件导入包时呈灰色,而别的文件却能正常显示,我按照CSDN博客上给的设置
①右键点击项目,找下面的Mark Directory as 选择Source Root”
以及
②点击File-Invalidte Caches/Restart…重启
两种方法均不起作用,无法解决问题。

我的解决方法:将鼠标移动到那行代码,点击出现提示“Unused import statement”表示import声明不可用,左边同时出现黄色小灯泡,将鼠标移动至黄色小灯泡那里,会出现向下箭头,点击箭头出现下拉菜单,继续点击第一条“Optimize imports”(切记要点击的是最右边的三角号,不是这一整行,否则会出错),右面选择第四个“Suppress for statement”,即可。


import pygame重新点亮,一切恢复原样!

总结一下:发现上述操作实际上是为无法使用的导入声明添加了内容为“# noinspection PyUnresolvedReferences”的注释,它专门针对“This inspection detects names that should resolve but don’t. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.”提示的情况。其作用是:让PyCharm 在代码检查时人为跳过某些特定部分的代码检查。

你可能感兴趣的:(日常用到)