Ubuntu: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打包环境搞了好久,各种各样的问题,搞了好几天,最终还是成功了,希望可以帮助到大家。

  • 4
    点赞
  • 10
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

A-Little-Tester

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值