Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在不使用pythonapi的情况下执行PyObject的深度复制(例如通过C、Rust等)?_Python_C_Deep Copy_Gil_Pyobject - Fatal编程技术网

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

有没有一种方法可以在不使用pythonapi的情况下执行PyObject的深度复制(例如通过C、Rust等)?,python,c,deep-copy,gil,pyobject,Python,C,Deep Copy,Gil,Pyobject,我想知道是否有人知道我可以使用一个实现/库来执行PyObject的深度复制,而不必使用pythonapi 我更喜欢C语言(正如我目前使用的,并且对CFFI有点熟悉),但是任何语言(无论是哪种语言,例如RUST),我都会非常感激 这样做的原因是,我正在尝试执行Python变量分析(对于实时Python调试库),但不希望在正在分析的程序执行期间执行分析(因为这将极大地影响程序性能) 如果我能在执行后(但在程序终止之前)分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是不需

我想知道是否有人知道我可以使用一个实现/库来执行PyObject的深度复制,而不必使用pythonapi

我更喜欢C语言(正如我目前使用的,并且对CFFI有点熟悉),但是任何语言(无论是哪种语言,例如RUST),我都会非常感激

这样做的原因是,我正在尝试执行Python变量分析(对于实时Python调试库),但不希望在正在分析的程序执行期间执行分析(因为这将极大地影响程序性能)

如果我能在执行后(但在程序终止之前)分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是不需要GIL的C程序,以便主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。