提示框报错:failed to execute script

命令行报错:no module named

在你的 .py文件所在目录下的build/py文件名/warn-py文件名.txt中可以看到一些警告信息,多是一些missing module named xxx




python pyinstaller spec文件 pyinstaller 报错_报错


我对比了一个成功了的和出错了的这个文件,发现上面基本上都一样的,只有这最后这部分,是这个出错的特有的,而我也确实在我的py文件中使用了docx这个模块,说明问题正出在这。

  • 如果缺少的这个模块是你自己写的模块,而且是用的pycharm的编译器,一种可能的原因是路径的问题。

我在pycharm需要这样导入一个我自己写的函数

from application.video_format_convert.convert import convert

这样是从根目录一层一层找到我的函数再导入,但是这样写pyinstaller就会失败,大概它不会跑出当前文件的范围跑到更上好几层文件去找,会报no modle named ‘application’的错。然后我把convert.py拷到了同级目录下,通过这样的方式导入

from convert import convert

再pyinstaller就成功了,虽然这样写在pycharm编译器中是无法通过的。

  • 引入不是自己写的包,找到一种这样的方案

一种方法是编辑.py文件所在目录下的py文件名.spec文件,其中有这样一个属性hiddenimports=[]将报错的功能模块名填入其中,在我这里即hiddenimports=['docx']




保存退出,然后在pyinstaller一下这个文件

pyinstaller -F -w codeout.spec

but it does’t work in my condition.

  • 还找到一种方案

说是追加一个参数, --hidden-import=缺少的包 ,比如我这里应该是

pyinstaller -F -w codeout.py --hidden-import=docx

大概意思应该是悄悄的导入一下这个包,但是在我这儿仍然不能解决问题。。。

其实上面两种方式是做了同一件事,其产生原因可以看这里

有时pyinstaller的分析器认为它已经找到了所有需要的模块,但实际却没有,这往往是存在隐藏的导入(hidden import)。当代码使用__import__或exec或eval等函数时,可能会出现隐藏的导入。当扩展模块使用python/c API进行导入时,也可能出现隐藏的导入。当这种情况发生时,分析器无法侦测,也不会有任何警告,只有在运行时才会出现错误。

这两种方式都可以同时指定多个,做法看这里

  • 命令行模式:
    –hidden-import Modulename 可以多次使用
    例:–hidden-import docx --hidden-import Pillow
  • 修改spec模式:
    hiddenimports=[‘docx’],
    例:hiddenimports=[‘docx’, ‘Pillow’],
  • 最终是怎么解决的

这个真让我没脾气,我是的Anconda的环境中操作的,我明明记得已经在当前环境下安装了pyinstaller,实际上没有。。。但是即使在其他环境下安装了pyinstaller,在当前环境下也是可用的。。。所以我就一直没发现这个问题,而pyinstaller会根据.py文件中的import的模块pyinstaller所在的环境找支持模块并打包,在pyinstaller的那个环境下,我并没有安装响应的包!

然后我在当前环境像重新安装了pyinstaller,再次打包,果然,就成功了

总结一下注意事项:如果用Anaconda环境的话,保证你的.py文件,pyinstaller都在同一个环境下,而且在命令行进行操作的时候,一定要进入该环境下,这样pyinstaller在进行封装的时候才能正确的找到支持包。

  • 令附两篇我觉得还算不错的pyinstaller科普文章

Pyinstaller打包py文件简明教程

pyinstaller简洁教程