Можно ли получить доступ к объекту через адрес памяти? - PullRequest
3 голосов
/ 19 августа 2011

В CPython встроенная функция id(x) возвращает адрес памяти x.
Возможно ли это изменить? Обновление : причина в том, что мне это нужно, потому что я использую программу со встроенным Python.И в этой программе я могу создавать так называемые «узлы», которые могут общаться друг с другом, но только с целыми числами, строками и прочим, но мне нужно «перенести» список между ними (что невозможно обычным способом).

Ответы [ 3 ]

2 голосов
/ 19 августа 2011

Если ваша цель - отправить информацию между различными процессами Python, запущенными одновременно, проверьте многопроцессорность или сельдерей.

Если вы просто хотите сохранить / восстановить / передать произвольные объекты Python, посмотрите pickle и marshal .

Не делай этого, это неправильно и плохо!

>>> x = 'asdd3r3'
>>> b = id(x)
>>> for key, value in globals().iteritems():
...     if id(value) == b:
...         break
...
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
>>> for key, value in globals().iteritems():
...     if id(value) == b:
...         break
...
>>> print value
asdd3r3
>>>

Вы должны повторить это и для locals(). Как вы можете видеть выше, это не будет работать, если вы создаете новое имя в области видимости, перебирая пространство имен области. Это, вероятно, также сломано дюжиной других способов.

Не делай этого, это неправильно и плохо!

1 голос
/ 19 августа 2011

Я никогда не сталкивался с функцией, которая могла бы сделать это, нет.Но вы можете сохранить внутренний индекс каждого создаваемого вами объекта и сохранить его, а также адрес его памяти.Затем выполните поиск в таблице.

0 голосов
/ 10 ноября 2011

Я создал общую библиотеку, которая содержит следующий код:

#include "Python.h"
extern "C" __declspec(dllexport) PyObject* PyObjectFromAdress(long addr) {
    return (PyObject*) addr;
}

скомпилировал его и упаковал с помощью ctypes:

import ctypes
dll = ctyes.cdll.thedll
object_from_id = dll.PyObjectFromAdress
object_from_id.restype = ctypes.py_object()

Теперь вы можете обмениваться объектами python через их памятьАдрес внутри одного процесса Python.

l1 = []
l2 = object_from_id( id(l1) )
print l1 == l2
l1.append(9)
print l2

Но будьте в курсе уже собранных объектов!Следующий код приведет к сбою интерпретатора Python.

l2 = object_from_id( id([]) )
l2.append(8)
...