有没有一种方法可以在不使用pythonapi的情况下执行PyObject的深度复制(例如通过C、Rust等)?
我想知道是否有人知道我可以使用一个实现/库来执行PyObject的深度复制,而不必使用pythonapi 我更喜欢C语言(正如我目前使用的,并且对CFFI有点熟悉),但是任何语言(无论是哪种语言,例如RUST),我都会非常感激 这样做的原因是,我正在尝试执行Python变量分析(对于实时Python调试库),但不希望在正在分析的程序执行期间执行分析(因为这将极大地影响程序性能) 如果我能在执行后(但在程序终止之前)分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是不需要GIL的C程序,以便主Python程序可以不间断地继续执行) 我个人不认为有什么,因为我已经看过了,但认为它可能值得一试,询问堆栈溢出的人 谢谢,,有没有一种方法可以在不使用pythonapi的情况下执行PyObject的深度复制(例如通过C、Rust等)?,python,c,deep-copy,gil,pyobject,Python,C,Deep Copy,Gil,Pyobject,我想知道是否有人知道我可以使用一个实现/库来执行PyObject的深度复制,而不必使用pythonapi 我更喜欢C语言(正如我目前使用的,并且对CFFI有点熟悉),但是任何语言(无论是哪种语言,例如RUST),我都会非常感激 这样做的原因是,我正在尝试执行Python变量分析(对于实时Python调试库),但不希望在正在分析的程序执行期间执行分析(因为这将极大地影响程序性能) 如果我能在执行后(但在程序终止之前)分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是不需
Nelson在C语言中,有
memcpy
用于制作结构的深度副本,并且结构与OOP中的对象最接近。因此,如果可以获得内存中Python对象的大小及其内存位置,则可以使用memcpy()
对其进行深度复制(,)。您可以在Python中通过编写额外的模块()或类似cython()的机制来实现这一点
但是,如果Python对象包含指向子结构
memcpy
的指针,则不会生成深度副本()
在这种情况下,您必须为Python对象的副本分配内存,并手动复制每个子结构
-为什么复制对象是一件可怕的事情?
更新:
如注释中所述,使用C
memcpy
不是最佳解决方案,因为子结构可能实现为指针。因此,也许可以尝试使用Python的复制模块(),或者分析其源代码,并根据您的需要调整它不,没有。另外,如果你没有持有GIL,那么你得到的就是垃圾。如果你没有获得GIL,你就无法安全地复制Python对象,因此你最好使用。我认为这是一种情况,在这种情况下,你需要自定义补丁CPython,风险由你自己承担“如果Python对象包含指向子结构的指针,memcpy将不会生成深度副本”--一个PyObject
不总是包含指针吗?在Python中,任何传递都是通过赋值完成的:没有固有的指针,另外,还有一个问题是知道要复制多少数据。在CPython中,许多不同类型的对象由PyObject*
类型的指针指向。显然,Python知道如何计算指向对象的实际类型,因此其他代码也可以,但是,在执行浅层复制之前,这些信息都需要确定。对Python对象实现的更深入的了解在@ralfhtp OP中,也在@ralfhtp OP中,他询问如何制作PyObject
——它(我相信)是一个包含指针的C结构。我不知道OP想做什么,但我怀疑memcpy
是否足以完成这项任务。CPython大量使用指针,以至于memcpy
的肤浅本质迟早会引入bug。