提示框报错:failed to execute script
命令行报错:no module named
在你的 .py文件所在目录
下的build/py文件名/warn-py文件名.txt中可以看到一些警告信息,多是一些missing module named xxx
我对比了一个成功了的和出错了的这个文件,发现上面基本上都一样的,只有这最后这部分,是这个出错的特有的,而我也确实在我的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简洁教程