您几乎肯定会问错问题,而Raymond Hettinger的答案几乎肯定是您真正想要的。
尝试挖掘cpython解释器的内部内容以进行学习或审核其安全性漏洞或类似内容可能会很有用……但是即使那样,您最好还是将Python解释器嵌入程序并编写暴露无论您想在Python解释器中使用什么,或者至少编写一个C扩展模块来让您操作cpython对象。
但是,您确实确实需要执行此操作……
首先,没有可靠的方法甚至可以从获取地址repr
。大多数具有有用的eval
-able表示形式的对象都会为您提供。例如,的代表('1', 1)
是"('1', 1)"
,不是<tuple at 0x10ed51908>
。同样,即使对于没有有用表示的对象,返回<TYPE at ADDR>
也只是一种未声明的约定,许多类型都遵循该约定(这是用户定义类的默认值),而不是您可以依赖的约定。
cpython实现细节:这是对象在内存中的地址。
(当然,如果您有要调用id
(或repr
)的对象,则无需通过指针对其进行取消引用,并且如果您没有该对象,则可能是垃圾回收,因此没有要取消引用的内容,但是也许仍然有它,只是不记得你放在哪里了……)
接下来,您如何处理此地址?好的,Python不会公开任何功能来实现与相反的功能id
。但是Python C API有充分的文档记录- 并且,如果您的Python是基于共享库构建的,则可以ctypes
通过加载C API来访问C API 。实际上,ctypes
提供了一个特殊变量,该变量会自动加载正确的共享库以在上调用C APIctypes.pythonapi
。
在非常老的版本中ctypes
,您可能必须明确地找到并加载它,例如pydll = ctypes.cdll.LoadLibrary('/usr/lib/libpython2.5.so')
(这是针对将Python 2.5安装在/ usr / lib中的Linux;显然,如果这些细节中的任何一个不同,则确切的命令行也会有所不同。)
当然,崩溃Python解释器要比做任何有用的事情容易得多,但是做任何有用的事情也不是没有可能,并且尝试它可能会很有趣。