将编码的 str 传递给 ctypes 库时,Python 何时会进行垃圾回收?
When will Python garbage collect when passing an encoded str to ctypes library?
我在库中有一个函数需要一个 char *
,我想向它发送一个编码的 str
。理想情况下,我想调用 encode
内联函数调用:
my_lib = cdll.LoadLibrary('my_lib.so')
my_string = 'hello'
my_lib.my_func(my_string.encode('utf-8'))
但我担心my_string.encode('utf-8')
的 return 值的 bytes
实例会在之前被 Python 删除(通过垃圾收集或引用计数)库函数使用它。这可能吗,所以我真的应该做下面的事情吗?
my_lib = cdll.LoadLibrary('my_lib.so')
my_string = 'hello'
my_string_encoded = my_string.encode('utf-8')
my_lib.my_func(my_string_encoded)
您的两个代码片段都是安全的,因为在每次函数调用开始时,参数的引用计数器都会递增,而在 return 时它们会递减。因此临时 bytes
对象在调用期间保持活动状态,并且其数据指针保持有效。
我在库中有一个函数需要一个 char *
,我想向它发送一个编码的 str
。理想情况下,我想调用 encode
内联函数调用:
my_lib = cdll.LoadLibrary('my_lib.so')
my_string = 'hello'
my_lib.my_func(my_string.encode('utf-8'))
但我担心my_string.encode('utf-8')
的 return 值的 bytes
实例会在之前被 Python 删除(通过垃圾收集或引用计数)库函数使用它。这可能吗,所以我真的应该做下面的事情吗?
my_lib = cdll.LoadLibrary('my_lib.so')
my_string = 'hello'
my_string_encoded = my_string.encode('utf-8')
my_lib.my_func(my_string_encoded)
您的两个代码片段都是安全的,因为在每次函数调用开始时,参数的引用计数器都会递增,而在 return 时它们会递减。因此临时 bytes
对象在调用期间保持活动状态,并且其数据指针保持有效。