Python 正确使用ctypes调用_Py_Mangle?

Python 正确使用ctypes调用_Py_Mangle?,python,exception,python-3.x,ctypes,name-mangling,Python,Exception,Python 3.x,Ctypes,Name Mangling,当我坐在蘑菇上,思考着写一个函数来实现Python的名称混乱算法的复杂性时,我的脑子里出现了一个非常好的想法。为什么不使用已经编制成语言的配方来实现这样的目标呢?所以我从书包里拿出ctypes来帮助这项工作,并执行了ctypes.pythonapi.\u Py\u Mangle('Demo','u测试')。你瞧,一个错误无中生有地出现了,它说:OSError:exception:access违例读取0x00000A65646F00A8,除此之外,没有费心解释这个难题 与口译员的充分互动如下: P

当我坐在蘑菇上,思考着写一个函数来实现Python的名称混乱算法的复杂性时,我的脑子里出现了一个非常好的想法。为什么不使用已经编制成语言的配方来实现这样的目标呢?所以我从书包里拿出
ctypes
来帮助这项工作,并执行了
ctypes.pythonapi.\u Py\u Mangle('Demo','u测试')
。你瞧,一个错误无中生有地出现了,它说:
OSError:exception:access违例读取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
win32上的Python 3.4.2(v3.4.2:ab2c023a9432,2014年10月6日,22:16:31)[MSC v.1600 64位(AMD64)] 有关详细信息,请键入“copyright”、“credits”或“license()”。 >>>导入ctypes >>>ctypes.pythonapi.\u Py_Mangle('Demo','u_test')) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 ctypes.pythonapi.\u Py_Mangle('Demo','u_test')) OS错误:异常:访问冲突读取0x00000A65646F00A8 有人知道需要更改什么才能成功调用mangling函数吗?

多亏了作者的评论,问题的答案非常简单:

>>> 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'

pythonapi
PyDLL
的一个实例,它是
CDLL
的一个子类,在函数指针上设置一个标志,以防止在调用期间释放全局解释器锁(GIL)。否则,默认参数转换和结果类型与
CDLL
相同。因此,您需要定义类型:
ctypes.pythonapi.\u Py_Mangle.argtypes=[ctypes.Py_对象,ctypes.Py_对象]
ctypes.pythonapi.\u Py\u Mangle.restype=ctypes.Py\u object
。仅供参考,如果您的代码必须在pypypy、Jython或IronPython上运行,这将不会有帮助。确实应该有一个
sys.name\u mangle
inspect.name\u mangle
来为您执行此操作。@eryksun:是否有功能请求或PEP?或者至少是一次
python思想
讨论?