有没有一种方法可以在不使用Python API的情况下执行PyObject的深度复制(例如通过C、Rust等)



我想知道是否有人知道我可以在不使用Python API的情况下使用实现/库来执行PyObject的深度复制。

我更喜欢C语言的东西(我目前使用的,对CFFI有点熟悉(,但任何东西(无论语言如何,例如RUST(都将不胜感激。

原因是,我试图对Python变量进行分析(用于实时Python调试库(,但不想在执行被分析的程序时进行分析(因为这会极大地影响程序性能(。

如果我能在执行后(但在程序终止之前(分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是一个不需要GIL的C程序,这样主Python程序就可以不间断地继续执行(。

我个人不认为有什么,正如我已经看过的那样,但我认为在Stack Overflow上询问某人可能值得一试。

谢谢。

在C中,有memcpy用于制作结构的深度副本,结构与OOP中的对象最接近。因此,如果你能获得Python对象在内存中的大小及其内存位置,你就可以使用memcpy()对其进行深度复制(C中的深度复制数组…malloc?,对结构进行深度复制……对结构进行浅层复制(。您可以在Python中通过编写一个附加模块来实现这一点(https://docs.python.org/3/extending/extending.html)或像cython这样的机制(https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html)

但是,如果Python对象包含指向子结构的指针,memcpy将不会产生深度复制(C++对对象的深度复制(在这种情况下,您必须为Python对象的副本分配内存,并手动复制每个子结构

https://agiledeveloper.com/articles/cloning072002.htm-为什么复制对象是一件可怕的事情

更新:

如注释中所述,使用memcpy不是最佳解决方案,因为子结构可能被实现为指针。因此,也许可以尝试使用Python的copy模块(https://pymotw.com/2/copy/(或分析其源代码并根据您的需求进行调整

最新更新