MyCollege1999 2024-08-28 17:35 采纳率: 59.2%
浏览 19
已结题

py编出exe后出现NoModule

用pycharm写的hardware_info.py文件,依赖同一个tools目录下的login_info.py, 打包exe文件后,在tools下运行提示 No module named ‘tools’。
这个tools是自写的模块,不是python自带的,pyinstaller就识别不出来了,事实上运行py文件时可以运行,打包后就不行了
啥原因呢?网上查看了很多帖子也没有解决掉,再请教下各位码友。。

编译方式:

img

文件目录:

img

执行时的错误:

img

  • 写回答

2条回答 默认 最新

  • 专家-吕布[在线] 2024-08-28 21:59
    关注

    引自当下最先进的AI大模型:ChatGPT 4o,若有帮助,还望采纳最好能打赏点哦谢谢支持。


    您在使用pyinstaller将Python脚本打包为exe时,出现了 No module named 'tools' 的错误。这种情况通常发生在你的项目结构中存在相对导入,并且在打包过程中没有正确处理这些导入。以下是一些可能的解决方法:

    1. 修改相对导入为绝对导入

    如果你的hardware_info.py中使用了相对导入(如from . import login_info),可以尝试将相对导入修改为绝对导入。假设tools是顶级目录,你可以这样修改:

    from tools import login_info
    

    2. 确保模块在打包时被包含

    在使用pyinstaller时,确保所有的模块都被正确打包。可以通过--hidden-import选项手动指定依赖模块:

    pyinstaller --hidden-import=tools.login_info hardware_info.py
    

    3. 调整spec文件

    hardware_info.spec文件中,手动添加tools模块的路径,使pyinstaller知道需要包含这个模块。修改spec文件的Analysis部分:

    a = Analysis(['hardware_info.py'],
                 pathex=['D:\\path\\to\\tools'],
                 binaries=[],
                 datas=[],
                 hiddenimports=['tools.login_info'],
                 ...
                 )
    

    4. tools目录添加到系统路径

    hardware_info.py的开头添加代码,将tools目录动态添加到sys.path,这样即使在打包后的环境中,也可以找到这个模块:

    import sys
    import os
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'tools')))
    

    5. 打包时使用--onefile选项

    尝试使用--onefile选项打包,这样会将所有的依赖打包到一个exe文件中:

    pyinstaller --onefile hardware_info.py
    

    6. 检查文件结构

    确保在打包之前,项目的目录结构是正确的,所有依赖的模块和脚本都在同一个工作目录下。特别是要确保打包时使用的路径与开发环境中的路径一致。

    通过以上方法,应该能够解决pyinstaller打包后无法找到自定义模块的问题。如果问题仍然存在,可以提供更多的详细信息,继续帮助排查问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月10日
  • 已采纳回答 9月2日
  • 创建了问题 8月28日