将python工程打包成.exe可执行文件

  1. 文件排列格式如图
    在这里插入图片描述
  2. 安装pyinstaller,这里和单独py文件打包不同(1pip install pyinstaller 2pyinstaller -F run.py),需要从github下载develop版本,之后将其放到放到python的site-package文件夹下,进入pyinstaller文件夹下,如下
    在这里插入图片描述
    然后以管理员身份打开cmd或者powershell,cd到pyinstaller-develop中,执行如下命令:
pip uninstall pyinstaller  #如果之前安装过pyinstaller,需要先卸载
python setup.py build
python setup.py install
  1. 在安装完成之后,需要安装PyQT5==5.9,目前来看其他版本的不知道行不行,5.11版本就不行。因此安装方法如下(安装的过程中会自动把其他版本的QT卸载,所以不需要预先卸载,直接安装就行):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQT5==5.9
  1. 安装完qt5之后,还需要更新一下setup_tools(如果你的时最新的,可以不更新,但为了错误还是更新一下吧),安装命令如下:
pip install --upgrade setuptools --ignore-installed
  1. 在上述安装步骤完成之后,就表示配置环境已经弄好了,接下来就需要开始打包过程了。
  2. 先在工程文件夹下,找到主函数,我这里是run.py函数,之后制作.spec文件,方法是在命令行中敲入命令:
pyi-makespec run.py
  1. 编辑run.spec文件,可以用Notepad ++
# -*- mode: python -*-
 
block_cipher = None

a = Analysis(['main.py', 'monitor.py',  
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\caption_recognizer.py', 
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\image_recognizer.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\image_vectorizer.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\network2.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\test_fun.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\unicom_area.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\unicom_area_finder.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\unicom_area_include_caption_judger.py',
'E:\\py_project\\test_wpf_python_msg\\src\\recognition_module\\value_vectorizer.py'],
             pathex=['E:\\py_project\\test_wpf_python_msg'],
             binaries=[],
             datas=[('E:\\py_project\\test_wpf_python_msg\\images', 'images'),
			('E:\\py_project\\test_wpf_python_msg\\network_parameters', 'network_parameters')],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='main',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='main')

(1)第一个列表中写所有的py文件,与run一个文件夹的可以直接写文件名,不一个文件夹的需要写完整的文件路径。
(2)datas是中的元素是tuple类型,tuple的第一个参数是python项目中data文件(非py文件)的路径,第二个参数是data在exe中保存此资源的文件夹名,要和项目中的文件夹名相同
(3)最重要: 因为编译成exe之后的main.exe是在最外层的文件夹的。因为run.py是入口文件,所以被调用的其他py文件的当前路径都是run.py文件的当前路径。所以在源代码中就一定要把run.py放到最外层的项目文件夹中,这样run.py的当前路径才能和run.exe的路径保持一致,才能让其他的py文件的当前路径不变,他们才可以找到data资源。

  1. 用之前配置的spec文件制作exe:
 pyinstaller -D run.spec
  1. 生成的exe在dist文件夹中
  2. bug及解决办法:
    (1)selenium报platform_sensor_reader_win.cc(242)] NOT IMPLEMENTED的解决办法
    问题描述:
    写python爬虫的过程中,用selenium调用chrome爬去页面,在pycharm中运行正常不报错,但是用pyinstaller封装成.exe文件运行时,一直报platform_sensor_reader_win.cc(242)] NOT IMPLEMENTED的错,不管chrome是不是headless都报,虽然程序可以执行,但影响查看爬虫自身的logging
    解决方法:
    禁止chromedriver打印日志console信息
options = webdriver.ChromeOptions()
options.add_argument('--log-level=3')
browser = webdriver.Chrome(chrome_options=options)
browser.get(url)
    ##            INFO = 0, 
    ##            WARNING = 1, 
    ##            LOG_ERROR = 2, 
    ##            LOG_FATAL = 3
    ##            default is 0

(2)pyinstaller打包发布后的exe文件打开控制台闪退解决
解决步骤:

1、打开cmd
2、cd到的exe文件目录
3、输入 ***.exe

(3)多进程无法运行
Windows的multiprocessing使用时在多进程之前需要加上 multiprocessing.freeze_support()

......
def main():
    multiprocessing.freeze_support()
    p1 = multiprocessing.Process(target=s1)
    p2 = multiprocessing.Process(target=s2)

    p1.start()
    p2.start()

    p1.join()
    p2.join()
......

(4)路径问题
若不能正常运行,则注意路径是否出错。
(5)程序运行完一次后,又运行了两次!
做成可执行文件后,exe运行时会将所有__name__ == '__main__都运行一次!
除了主程序,其他py程序的if name == 'main’需要注释掉 !
(6)编码时出现:TypeError: from_buffer() cannot return the address of the raw string within a str or unicode or bytearray object 参考:https://github.com/paramiko/paramiko/issues/1027
(7)无访问权限
以管理员身份运行cmd

pip uninstall cryptography 
pip install --upgrade cryptography

参考文章:
https://blog.csdn.net/wq604887956/article/details/83750926
https://blog.csdn.net/djshichaoren/article/details/79801531

————————————————————————————————————————————
微信关注号:python爬虫机器学习深度学习
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值