必须安装 libgcc_s.so.1 才能使 pthread_cancel 工作
Posted
技术标签:
【中文标题】必须安装 libgcc_s.so.1 才能使 pthread_cancel 工作【英文标题】:libgcc_s.so.1 must be installed for pthread_cancel to work 【发布时间】:2021-02-24 02:23:02 【问题描述】:我在 python 上;我正在尝试关闭通过 ThreadPoolExecutor 运行的函数,但关闭时因错误而崩溃:
libgcc_s.so.1 must be installed for pthread_cancel to work
函数提交:
record_future = self.executor.submit(next,primitive)
primitive
是一个迭代器,通常会返回一个值,但在某些情况下,它需要等待一段时间才能返回一个值(因为计算时间长等)。在这些情况下,当我需要关闭正在运行的线程时,我不能等待迭代器完成返回,需要立即关闭它。我做到了:
executor.shutdown(wait=False)
但是,当执行到这一点时,我得到了 libgcc 错误。
我尝试通过手动安装来“解决”它:
apt-get install libgcc1:amd64
但没有骰子。我不确定python到底在哪里寻找这个库,否则我会尝试创建一个符号链接,因为该库已经安装在:
$ /sbin/ldconfig -p | grep libgcc
libgcc_s.so.1 (libc6,x32) => /usr/libx32/libgcc_s.so.1
libgcc_s.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /usr/lib32/libgcc_s.so.1
【问题讨论】:
【参考方案1】:您使用的是 Python 3.7 还是 3.8?
使用我的 Anaconda Python 3.8 在 Python 的 sounddevice
中也遇到此错误,但使用我的 Anaconda Python 3.7 时不会发生此错误。我已经在谷歌搜索中测试了所有的解决方法,并确保所有相关的包和库都是相同的版本,它仍然不起作用。我的最后一个猜想是 Python 3.8 和 3.7 的版本差异。虽然可能不是这样^_^
【讨论】:
我在 Python 3.8.0 中使用 tqdm 包时遇到了同样的错误。 Python 3.6.9 也不会发生这种情况。我没有任何想法,但我找到了bugs.ams1.psf.io/issue42888 我已经仔细检查过,我很确定 libgcc_s.so.1 已安装并可访问。似乎是 Python 3.8 的延迟加载动态库特性导致它出现在多个包中。【参考方案2】:我在Python mailing list 中发现了一种潜在的解决方法,即通过ctypes
显式加载libgcc_.so.1
,如下所示:
import ctypes
libgcc_s = ctypes.CDLL('libgcc_s.so.1')
必须确保在创建任何线程之前加载它,并且变量libgcc_s
一直持续到所有线程都关闭(即将它放在文件的开头)。
【讨论】:
我试过这个方法,但我现在得到以下信息:` OSError: /mnt/d/Projects/EBKA/edna_env/lib/python3.7/site-packages/mysql/vendor/libssl. so.1.1:符号 EVP_idea_cbc 版本 OPENSSL_1_1_0 未在文件 libcrypto.so.1.1 中定义,链接时间参考 ` 我有 python 多线程的 libgcc_s.so.1 问题。首先,我在使用这个解决方案时遇到了 OSError,就像 @asuprem 一样。然后,在任何导入解决它之前将解决方案放在我的代码顶部以上是关于必须安装 libgcc_s.so.1 才能使 pthread_cancel 工作的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Heroku 上部署 Streamlit 应用程序 - 缺少 libgcc_s.so.1
ImportError: 无法导入 pydot。您必须安装 pydot 和 graphviz 才能使 `pydotprint` 工作