资讯专栏INFORMATION COLUMN

原程序运行良好,Pyinstaller封装后运行出错 的分析

muzhuyu / 590人阅读

摘要:前言昨天决定分享一下最近写的爬虫程序,参考了这篇文章,看了下里面几个常见打包软件的简介表格可惜没因为是给小白用户使用,做成单个文件形式,只能在和之间选择去各自官网看了下,发现很久没更新了,对新版本的支持也不是太好,就决定用来封装打包这里略过

前言

昨天决定分享一下最近写的exhentai爬虫程序,参考了这篇文章,看了下里面几个常见打包软件的简介表格(可惜没nuitka)
因为是给小白用户使用,做成单个文件形式,只能在Pyinstaller和py2exe之间选择
去各自官网看了下,发现py2exe很久没更新了,对python3新版本的支持也不是太好,就决定用Pyinstaller来封装/打包
这里略过Pyinstaller的安装和使用,重点说明症状,分析过程,解决办法和教训

症状

打包成功

运行程序时出现如下报错

C:UsersxoxoPycharmProjectsHentai_Spider>main
Traceback (most recent call last):
  File "main.py", line 6, in 
    from config import args
  File "", line 2237, in _find_and_load
  File "", line 2226, in _find_and_load_unlocked
  File "", line 1200, in _load_unlocked
  File "", line 1129, in _exec
  File "C:Python34libsite-packagesPyInstallerloaderpyimod03_importers.py",
 line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "config.py", line 11, in 
    parser.add_argument("-sd", "--savedir", default=config["ARGS"]["SAVEDIR"])
  File "configparser.py", line 936, in __getitem__
KeyError: "ARGS"
[7836] Failed to execute script main

C:UsersxoxoPycharmProjectsHentai_Spider>
分析过程

0 . StackOverflow搜了下发现没啥经验可供参考……
1 . main.py程序是完全可以跑通的,从未出现过这个报错,所以确定问题出在封装过程中
2 . 报错信息上看,是(封装后的程序)执行config.py时出了问题
3 . 通过控制变量排除法(过程比较繁琐,不一一列举),确定是在读取config.ini时出的错,把赋值config_path这里改成确定的路径即可正常运行

代码如下:

config = configparser.ConfigParser()
config_path = os.path.join(os.path.dirname(__file__), CONFIG_FILE)
config.read(config_path)

顺便解释一下,我的设计意图是让config.py去读取其所在目录下的配置文件,main.py和config.py在同一目录

4 . 由于CONFIG_FILE是常量(文件名),那最终就怀疑到os.path.dirname(__file__)部分
5 . 在赋值config_path =这句后加上print(os.path.dirname(__file__),看看封装后这里的file会到哪个目录,发现变成了C:UsersxoxoAppDataLocalTemp\_MEI92882

C:UsersxoxoPycharmProjectsHentai_Spider>main
C:UsersxoxoAppDataLocalTemp\_MEI92882
Traceback (most recent call last):
  File "main.py", line 6, in 
    from config import args
  File "", line 2237, in _find_and_load
  File "", line 2226, in _find_and_load_unlocked
  File "", line 1200, in _load_unlocked
  File "", line 1129, in _exec
  File "C:Python34libsite-packagesPyInstallerloaderpyimod03_importers.py",
 line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "config.py", line 12, in 
    parser.add_argument("-sd", "--savedir", default=config["ARGS"]["SAVEDIR"])
  File "configparser.py", line 936, in __getitem__
KeyError: "ARGS"
[9296] Failed to execute script main

C:UsersxoxoPycharmProjectsHentai_Spider>

6 . 可以看到config.py虽然封装前和main.py在一个文件夹下,但被封装后,执行时就处于临时文件夹,这时候取其自身所在目录的动作就有问题

解决方案

main.py来抓目录信息,再传给config.py(中函数)

教训

封装程序没有聪明到能理解设计意图,所以写代码的得更聪明点

如果某项目可能会被封装,让被封装的那个程序来抓取目录信息并传递

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44478.html

相关文章

  • 将 exe 文件反编译成 Python 脚本

    摘要:打包成单文件所使用的命令为打包成文件夹所使用的命令为不管是哪种打包方式都会留下一个文件。这样我们只需将脚本文件和脚本文件放置到同一文件夹下,运行我们的脚本。可以看到已经完美的反编译出其中的脚本好了,相信大家已经明白了反编译的原理。 近期阅读了一篇很感兴趣的文章,为免后续文章被删无法再阅读,现...

    xbynet 评论0 收藏0
  • ❤️Python实用工具之制作证件照(有界面、附源码、赞关藏)❤️

    镇楼图 文章目录 一点想说的必要配置removebg配置安装对应的 Python 库获取API Key 无界面版修改图片背景色修改图片大小 升级版设置窗口主题与标题添加选择图片路径组件添加选择保存路径组件添加选择背景颜色组件添加填写图片尺寸组件添加填写API-KEY组件添加控制按钮添加输出框显示设置组件位置设置组件样式 源码打包❤️源码获取方式❤️ 一点想说的 想当年我不会...

    Doyle 评论0 收藏0
  • 使用PyInstaller 将python程序 .py转为 .exe

    摘要:本文来自最近经常用到一个程序,但是每次在不同电脑上用,希望能把脚本发布为脱离平台运行的可执行程序,比如单个。本身并不属于包。在安装之前需把环境配置好。测试打包文件放在当前目录的文件夹里面命令运行成功后会生成一个文件夹。 本文来自 Alliots blog最近经常用到一个.py程序,但是每次在不同电脑上用,希望能把Python脚本发布为脱离Python平台运行的可执行程序,比如单个exe...

    testbird 评论0 收藏0
  • 使用pyinstaller将python打包为exe

    摘要:起因是从某发现了一个站挂机助手,依赖于直播的一个库,作者的处理方式是将依赖的库打包为,然后使用进行调用。它能够在等操作系统下将源文件打包,通过对源文件打包,程序可以在没有安装的环境中运行,也可以作为一个独立文件方便传递和管理。 起因是从某 hub 发现了一个B站挂机助手,依赖于直播的一个库,作者的处理方式是将依赖的库打包为 exe,然后使用 python 进行调用。 然后因为依赖的 l...

    AnthonyHan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<