[Deepin - Pycharm调试记录] Pyinstaller索引系统库问题

Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库

现象

在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示

OSError: Python library not found: libpython3.7mu.so.1.0, libpython3.7.so.1.0, libpython3.7.so, libpython3.7m.so.1.0, libpython3.7m.so

分析原因

step1

分析其原因是pyinstaller搜索不到libpython3.7.so.1.0

于是find了一下/usr/lib下所有安装的系统库,发现只有python2.7和python3.5两个版本。

./usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0
./usr/lib/x86_64-linux-gnu/libpython2.7.so
./usr/lib/x86_64-linux-gnu/libpython3.5m.so
./usr/lib/x86_64-linux-gnu/libpython3.5m.so.1
./usr/lib/x86_64-linux-gnu/libpython2.7.a
./usr/lib/x86_64-linux-gnu/libpython2.7.so.1
./usr/lib/x86_64-linux-gnu/libpython3.5m.a
./usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0

step2

这是因为我的python3.7版本安装是通过源码编译的,之前执行的命令如下

./configure --prefix=/usr/local/python-3.7.4 --enable-shared && make -j8 && make install

于是我在/usr/local路径下能找到libpython3.7.so.1.0

进一步分析

step3

因此可以推断出,pyinstaller的源码中,应该有一个地方是用于记录搜索系统库的地方。因此从完整的log出发

3959 INFO: Python library not in binary dependencies. Doing additional searching...
Traceback (most recent call last):File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/bin/pyinstaller", line 8, in <module>sys.exit(run())File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/__main__.py", line 124, in runrun_build(pyi_config, spec_file, **vars(args))File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/__main__.py", line 58, in run_buildPyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/building/build_main.py", line 783, in mainbuild(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/building/build_main.py", line 715, in buildexec(code, spec_namespace)File "/home/rodney/ProjectCode/pythonProject/py_demo/py_ui/build/ui_test.spec", line 19, in <module>noarchive=False)File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/building/build_main.py", line 277, in __init__self.__postinit__()File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/building/datastruct.py", line 155, in __postinit__self.assemble()File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/building/build_main.py", line 501, in assembleself._check_python_library(self.binaries)File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/building/build_main.py", line 605, in _check_python_librarypython_lib = bindepend.get_python_library_path()File "/home/rodney/ProjectCode/pythonProject/py_demo/venv/lib/python3.7/site-packages/PyInstaller/depend/bindepend.py", line 926, in get_python_library_pathraise IOError(msg)
OSError: Python library not found: libpython3.7mu.so.1.0, libpython3.7.so.1.0, libpython3.7.so, libpython3.7m.so.1.0, libpython3.7m.so

可以看出在python_lib = bindepend.get_python_library_path()这句话抛出了异常,也就意味着进这个文件的上下文去寻找,定位该函数的所在文件为

./Pyinstaller/depend/bindepend.py

step4

接下来就是阅读源码的过程,是个比较繁琐的工作,最终定位到一个叫find_Library的函数,大概位置在708行左右。函数比较长,但是其中有一个叫paths的变量引起了我们的注意,paths是个数组,正好有含有我们/usr/lib的系统库路径。

因此我们在后面添加我们实际的python3.7库的路径/usr/local/python-3.7.4/lib

def findLibrary(name):"""Look for a library in the system.Emulate the algorithm used by dlopen. `name` must include the prefix, e.g., ``libpython2.4.so``."""assert compat.is_unix, "Current implementation for Unix only (Linux, Solaris, AIX, FreeBSD)"# Look in the LD_LIBRARY_PATH according to platform.if compat.is_aix:lp = compat.getenv('LIBPATH', '')elif compat.is_darwin:lp = compat.getenv('DYLD_LIBRARY_PATH', '')else:lp = compat.getenv('LD_LIBRARY_PATH', '')lib = _which_library(name, filter(None, lp.split(os.pathsep)))# Look in /etc/ld.so.cache# Solaris does not have /sbin/ldconfig. Just check if this file exists.if lib is None:utils.load_ldconfig_cache()lib = utils.LDCONFIG_CACHE.get(name)if lib:assert os.path.isfile(lib)# Look in the known safe paths.if lib is None:# Architecture independent locations.# paths = ['/lib', '/usr/lib']paths = ['/lib', '/usr/lib', '/usr/local/python-3.7.4/lib']# Architecture dependent locations.if compat.architecture == '32bit':paths.extend(['/lib32', '/usr/lib32'])else:paths.extend(['/lib64', '/usr/lib64'])# Machine dependent locations.if compat.machine == 'intel':if compat.architecture == '32bit':paths.extend(['/usr/lib/i386-linux-gnu'])else:paths.extend(['/usr/lib/x86_64-linux-gnu'])# On Debian/Ubuntu /usr/bin/python is linked statically with libpython. Newer Debian/Ubuntu with multiarch# support puts the libpythonX.Y.so in paths like /usr/lib/i386-linux-gnu/.try:# Module available only in Python 2.7+import sysconfig# 'multiarchsubdir' works on Debian/Ubuntu only in Python 2.7 and 3.3+.arch_subdir = sysconfig.get_config_var('multiarchsubdir')# Ignore if None is returned.if arch_subdir:arch_subdir = os.path.basename(arch_subdir)paths.append(os.path.join('/usr/lib', arch_subdir))else:logger.debug('Multiarch directory not detected.')except ImportError:logger.debug('Multiarch directory not detected.')if compat.is_aix:paths.append('/opt/freeware/lib')elif compat.is_hpux:if compat.architecture == '32bit':paths.append('/usr/local/lib/hpux32')else:paths.append('/usr/local/lib/hpux64')elif compat.is_freebsd or compat.is_openbsd:paths.append('/usr/local/lib')lib = _which_library(name, paths)# Give up :(if lib is None:return None# Resolve the file name into the sonameif compat.is_freebsd or compat.is_aix or compat.is_openbsd:# On FreeBSD objdump does not show SONAME, and on AIX objdump does not exist, so we just return the lib we# have found.return libelse:dir = os.path.dirname(lib)return os.path.join(dir, _get_so_name(lib))

重新执行/调试

pyinstaller -F -w test.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习笔记(5):Python如何忽略warning的输出

告警现象 形如下图文的告警信息都可以使用告警屏蔽 添加代码 源代码添加 import warnings warnings.filterwarnings("ignore")命令行执行 python -W ignore file.py可以避免warnings输出影响我们调试&#xff0c;但是不要盲目设置取消输出。因为告警内容可能包…

[Deepin - Pycharm调试记录] Matplot3D动态画图报错问题

Deepin - Pycharm调试记录 - Matplot3D动态画图报错问题 写在开头的话 应该不会有人傻到看这个wiki吧&#xff0c;我花了1个小时才发现问题&#xff0c;是我自己方法调错了。 这个wiki不会细致的教大家如何使用matplotlib进行动态画图&#xff0c;或者动态画图的几种办法&…

【C语言基础】C语言异常捕获机制 - setjmp

C语言异常捕获机制 - setjmp 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 C语言没有C或Java的异常捕获机制&#xff0c;但可以通过setjmp/longjmp实现类似的效果&#xff1a; 使用setjmp保存当前执行环境到jmp_buf&am…

【C语言基础】C语言异常捕获机制 - assert

C语言异常捕获机制 - assert 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 通常一个良好的代码功能运行环境都有功能运行前检查和运行后检查两个方面。&#xff23;语言中提供了assert机制来做这件事情 assert 的作用是…

【c语言数据结构】二叉树

c语言数据结构完全二叉树 快速开始 直接参考示例代码即可 介绍 概念 二叉树&#xff08;Binary tree&#xff09;是树形结构的一个重要类型。 许多实际问题抽象出来的数据结构往往是二叉树形式&#xff0c;即使是一般的树也能简单地转换为二叉树&#xff0c; 二叉树的存…

git 指令全集

git 指令全集 指令集参考这里&#xff0c;后续会继续整理 https://www.runoob.com/git/git-tutorial.html 基本使用流程 场景&#xff11;&#xff1a;建立新仓 首先在本地新建一个仓 ~$ mkdir git_workspace ~$ git init与远程仓建立连接 # 查看所有的远端分支 -$ git rem…

UTHash使用教程

UTHash使用教程 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 Hash &#xff1a;散列&#xff0c;通过关于键值(key)的函数&#xff0c;将数据映射到内存存储中一个位置来访问。这个过程叫做Hash&#xff0c;这个映射函…

【C语言基础】gdb调试工具的使用

gdb调试教程 快速入门 要想快速入门gdb调试&#xff0c;可以直接翻阅基本案例&#xff1a;采内存 介绍 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c程序员&#xff0c;gdb是必不可少的工具 …

C/C++队列与循环队列

C/C数据结构 - 队列 循环队列 快速入门 介绍 1. 队列的定义 队列是一种线性存储结构&#xff0c;每次对队列的增删操作如下 增&#xff1a;在队列尾部添加元素 删&#xff08;取出&#xff09;&#xff1a;在队列头部删除元素 这种数据存储方式遵循“先进先出”&#xff0…

PyQt特殊对话框介绍

PyQt特殊对话框 对话框基类&#xff1a;QDialog 对话框基本用法&#xff1a; 模态窗口&#xff1a; 当窗口设置为模态窗口时&#xff0c;不能对其父级别的窗口进行操作。QTdesigner里有控件可以勾选Func: QtWidgets.Dialog.setModal(True) [ True | False ] 窗口执行 exec&am…

PyQt5 让窗口在桌面居中的办法

屏幕居中核心函数 在我们开发的UI类中定义一个center方法&#xff0c;&#xff08;方法名自定&#xff0c;内容如下&#xff09;。其中QDesktopWideget方法在Qtwidgets头文件中。 然后在 __init__()中调用该 self.center()方法即可。 # 屏幕居中def center(self):# 获取窗口大…

PyQt5 QLineEdit输入密码

单行编辑器 QLineEdit 输入密码 单行编辑器直接继承于QWidget 常用方法&#xff1a; 设置显示模式&#xff1a;在设置密码栏常会使用这种模式 方法QLineEdit.setEchoMode 用法 假设你有一个QLineEdit()组件 self.UserpswdEdit QLineEdit()则你可以使用下面三种方式定义输…

Arduino 软件开发(一): GPIO读写

Arduino 软件开发&#xff08;一&#xff09; 目录 核心运行函数&#xff0c; 基础语法&#xff0c;数字控制&#xff0c;模拟控制 核心运行函数 void setup() 当Arduino程序开始运行时会调用setup()函数。通常setup()函数完成初始化一些变量、配置引脚状态及初始化调用的库…

JavaScript学习笔记:类与导包实例

NodeJS类与导包 在工程上&#xff0c;一个文件就是一个独立的模块&#xff0c;仅包含一个类。我们可以称之为类文件。因此当我们要使用这个模块的时候&#xff0c;我们会将这个类文件作为一个包导入到调用的文件里。方法如下&#xff1a; 0. 目录结构如下 - src|__ main.js|…

JavaScript学习笔记:常量,枚举,宏定义

NodeJS常量&#xff08;fake&#xff1a;宏定义&#xff09; 因为之前C/C代码开发习惯了&#xff0c;会用到一些宏定义来替换一些表意不明的数字&#xff08;就是含义不清的数字&#xff09;。而JS没有这种宏定义。上网找到一个链接作为参考&#xff1a;https://www.itranslat…

JavaScript学习笔记:函数与箭头函数

NodeJS函数 由于js是弱语言&#xff0c;因此&#xff0c;函数的入参和出参可以为任意形式而不用指定类型。当然也没有办法使用冒号的形式进行参数类型注释。但是typescript可以使用冒号形式进行参数类型注释。 1. 普通的函数定义 不带参数形式printHello带参数形式plus使用re…

Python学习笔记(1):用户输入,终端输入

#用户输入&#xff0c;操作 print("python 用户输入操作")# input(提示字符串)&#xff0c;函数阻塞程序&#xff0c;并提醒用户输入字符串 instr input("please input the string: ") print("input >> " instr)# 将输入的字符串转化成整…

Python学习笔记(2):生成器

介绍 我们可以通过列表生成式简单直接地创建一个列表&#xff0c;但是受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#xff0c;而且如果我们仅仅需要访问前面几个元素&#xff0c;那后面…

Python学习笔记(3):zipfile解压库

简介 python自带zipfile解压库&#xff0c;导入方式如下 import zipfile批量解压 先尝试无密码解压&#xff0c;如果失败&#xff0c;就输入密码。但是zipfile解压大文件速度很慢。 path rL:/resource/zipPackage passwd b123456 def compressFromZip():for temp_name in…

数字万用表使用方法

数字万用表使用方法 简介&#xff1a;数字万用表相对来说&#xff0c;属于比较简单的测量仪器。本篇&#xff0c;作者就教大家数字万用表的正确使用方法。从数字万用表的电压、电阻、电流、二极管、三极管、MOS场效应管的测量等测量方法开始&#xff0c;让你更好的掌握万用表测…