正确使用ctypes调用_Py_Mangle?
Proper use of ctypes to call _Py_Mangle?
当坐在蘑菇上思考编写一个函数来实现 Python 的名称修改算法的复杂性时,我想到了一个更好的主意。为什么不使用已经编写到语言中的方法来实现这样的目标呢?所以我从我的书包里拿出 ctypes
来帮助完成这项工作并执行了 ctypes.pythonapi._Py_Mangle('Demo', '__test')
。瞧,凭空出现了一个错误,说 OSError: exception: access violation reading 0x00000A65646F00A8
并且没有费心去解释这个难题。
与解释器的完整交互如下:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import ctypes
>>> ctypes.pythonapi._Py_Mangle('Demo', '__test')
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
ctypes.pythonapi._Py_Mangle('Demo', '__test')
OSError: exception: access violation reading 0x00000A65646F00A8
有谁知道需要更改什么才能成功调用 mangling 函数?
感谢eryksun的评论,问题的答案很简单:
>>> from ctypes import pythonapi, py_object
>>> py_mangle = pythonapi._Py_Mangle
>>> py_mangle.argtypes = py_object, py_object
>>> py_mangle.restype = py_object
>>> py_mangle('Demo', '__test')
'_Demo__test'
当坐在蘑菇上思考编写一个函数来实现 Python 的名称修改算法的复杂性时,我想到了一个更好的主意。为什么不使用已经编写到语言中的方法来实现这样的目标呢?所以我从我的书包里拿出 ctypes
来帮助完成这项工作并执行了 ctypes.pythonapi._Py_Mangle('Demo', '__test')
。瞧,凭空出现了一个错误,说 OSError: exception: access violation reading 0x00000A65646F00A8
并且没有费心去解释这个难题。
与解释器的完整交互如下:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import ctypes
>>> ctypes.pythonapi._Py_Mangle('Demo', '__test')
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
ctypes.pythonapi._Py_Mangle('Demo', '__test')
OSError: exception: access violation reading 0x00000A65646F00A8
有谁知道需要更改什么才能成功调用 mangling 函数?
感谢eryksun的评论,问题的答案很简单:
>>> from ctypes import pythonapi, py_object
>>> py_mangle = pythonapi._Py_Mangle
>>> py_mangle.argtypes = py_object, py_object
>>> py_mangle.restype = py_object
>>> py_mangle('Demo', '__test')
'_Demo__test'