TypeError:无法腌制 CompiledFFI 对象

Posted

技术标签:

【中文标题】TypeError:无法腌制 CompiledFFI 对象【英文标题】:TypeError: can't pickle CompiledFFI objects 【发布时间】:2019-03-12 21:53:19 【问题描述】:

我正在尝试从 Telnet 和 SSH 主机获取某些命令的输出并将它们存储在架子中。由于有很多命令,我正在使用多处理。 我有以下几个重要的方法:

    connectToHost:使用方法建立连接(SSH/ Telnet)。 ExecuteCommand:执行命令并获取输出。 main:我在这里迭代所有命令并使用multiprocessing 在字典中获取输出。这个方法调用另一个方法来合并来自其他进程的输出。

对于 Telnet,一切正常,但是当它是 SSH 连接时,我的代码在 process.start() 处失败,并且出现以下错误。

TypeError: can't pickle CompiledFFI objects

为什么即使我调用相同的方法,它也不能用于 SSH?如何解决这个问题?

【问题讨论】:

【参考方案1】:

当您启动一个新进程时,python 必须传递用于该进程的所有变量。在这种情况下,它是与某个主机的连接。为了做到这一点,必须对变量进行序列化(腌制)。

看起来 paramiko 使用了FFI 哪些对象不能被腌制。

问题可以通过将多处理改为多线程(不需要pickle)或从一开始就在每个进程中创建ssh连接(可能效率不高)来解决。

【讨论】:

以上是关于TypeError:无法腌制 CompiledFFI 对象的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法腌制 CompiledFFI 对象

PySpark / Glue:PicklingError:无法序列化对象:TypeError:无法腌制thread.lock对象

_pickle.PicklingError:无法序列化对象:TypeError:无法腌制_thread.RLock对象

多处理,Python3,Windows:TypeError:无法腌制 _thread.lock 对象

pickle.dump(模型,pickle_out)| TypeError:无法腌制 _thread._local 对象

TypeError:无法使用RQ腌制'_thread.lock'对象