Ubuntu:Pyinstaller 打包python文件问题总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Ubuntu:Pyinstaller 打包python文件问题总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4870字,纯文字阅读大概需要7分钟。
内容图文
![Ubuntu:Pyinstaller 打包python文件问题总结](/upload/InfoBanner/zyjiaocheng/930/58bac50cbee54f42b25ccab72c79781f.jpg)
Pyinstaller 打包python文件问题总结
环境
PC System:Ubuntu 18.04
Python Version:Python 3.8.0
Pyinstaller Version:Pyinstaller 4.0
一、Pyinstaller 打包过程中出现的问题
1. No module named ‘apt_pkg’
现象:
在打包过程中提示 ModuleNotFoundError: No module named ‘apt_pkg’。
解释:
(我的理解)是由于我之前装 python3.8 时,是通过编译源码来安装的,所以这些 .so 库文件没有,所以需要将 Ubuntu 自带的 python3.6 下面的这些库文件复制、改名然后粘贴到 python3.8 的 /usr/local/python38/lib/python3.8/ 目录下,因为我们在上个文档中已经将 python3 默认调用改为 python3.8 ,所以需要这一步操作。
解决:
步骤一:切换到 /usr/lib/python3/dist-packages/,使用 ls -l 36.so 查看当前目录下属于 python3.6 并且以 .so 结尾的文档,如下图所示:
步骤二:使用如下命令将上图所有文件复制并更名:
已存在的文件:apt_pkg.cpython- 36 m-x86_64-linux-gnu.so
需要复制并改名的文件:apt_pkg.cpython- 38 m-x86_64-linux-gnu.so
#例
$ sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so /usr/local/python38/lib/python3.8/apt_pkg.cpython-38m-x86_64-linux-gnu.so
这一步完成该问题就解决,重新打包即可,亲测有效。
2. OSError: Python library not found
现象:
出现如下提示:
OSError: Python library not found: Python8, libpython3.8m.dylib, Python, libpython3.8.dylib, .Python
* On Debian/Ubuntu, you would need to install Python development packages
* apt-get install python3-dev
* apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)
解释:
这是因为 python 找不到 libpython3.8.so.1.0 等python库导致的,根本原因是由于我们是通过编译python源码安装的 python3.8 ,所以这些库都没有动态链接的,因此我们需要对python3.8安装目录下的这些库建立动态链接,建立链接的方式很简单,只需要将 /usr/local/python38/lib/ 目录下的所有东西复制到 /usr/lib/ 下即可。
(注意:上一篇我们提到另外一种python安装方式,使用命令安装,但是也会出现这个问题,并且我还没有找到这些库文件,所以选择以编译源码的方式安装python)
解决:
$ sudo cp -r /usr/local/python38/lib/* /usr/lib/
这一步完成该问题就解决,重新打包即可,亲测有效。
3. Not found /usr/include/python3.4m/pyconfig.h
现象:
出现如下提示:
Unable to find "/usr/include/python3.8/pyconfig.h" when adding binary and data files.This would mean your Python installation doesn't
come with proper library files. This usually happens by missing development
package, or unsuitable build parameters of Python installation.
* On Debian/Ubuntu, you would need to install Python development packages
* apt-get install python3-dev
* apt-get install python-dev
解决:
$ sudo apt-get install libpython3.8-dev
这一步完成该问题就解决,重新打包即可,亲测有效。
4. RecursionError: maximum recursion depth exceeded while calling a Python object
现象:
...
File "/usr/lib/python3.8/ast.py", line 370, in generic_visit
self.visit(value)
File "/usr/lib/python3.8/ast.py", line 360, in visit
return visitor(node)
File "/usr/lib/python3.8/ast.py", line 364, in generic_visit
for field, value in iter_fields(node):
File "/usr/lib/python3.8/ast.py", line 206, in iter_fields
yield field, getattr(node, field)
RecursionError: maximum recursion depth exceeded while calling a Python object
解释:
导致这个问题的原因是pyinstaller默认的最大打包深度为1000,超过1000就会出现这个问题。因此就需要把默认的1000改大一点。
解决:
在生成的 xxx.spec 文件的第二行添加下面所示两行代码,之后再继续使用 pyinstaller 进行打包即可。
$ import sys
$ sys.setrecursionlimit(10000) #括号中的数字可以修改
$ pyinstaller xxx.spec
到这一步最大深度问题就解决了。
以上四个问题就是我在使用pyinstaller打包的时候遇到的问题,希望能够帮助到有缘人。
二、运行打包后的可执行文件出现的问题
1. ModuleNotFoundError:No module named ‘xxx’
这一类问题主要是因为打包的python文件中存在导入其他三方包的操作,但是在打包的时候并没有将第三方包打进去(通常也是不打进去的),所以提示找不到这个模块。解决方法就是下载该包就好了:
$ pip3 install xxx --default-timeout 10000
2. 可执行文件一直运行,死循环
我这边造成这个这个问题的原因是由于可执行程序调用的python不正确,我是直接执行的可执行程序,并没有选择哪个python版本来运行这个程序。
$ ./main
所以它会默认调用python这个软链接。可以看到它默认是调用到python2.7版本。
baiyp@ts:~$ python
Python 2.7.17 (default, Jul 20 2020, 15:37:01)
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
因此需要将python3.8链接到python上
$ sudo rm -rf /usr/bin/python
$ sudo ln -s /usr/local/python38/bin/python3.8 /usr/bin/python #python通过编译源码安装
之后再执行打包后的可运行文件即可。
总结
这次搞pyinstaller打包环境搞了好久,各种各样的问题,搞了好几天,最终还是成功了,希望可以帮助到大家。
内容总结
以上是互联网集市为您收集整理的Ubuntu:Pyinstaller 打包python文件问题总结全部内容,希望文章能够帮你解决Ubuntu:Pyinstaller 打包python文件问题总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。