3

CPythonでは、組み込み関数id(x)はのメモリアドレスを返しますx
これを元に戻すことは可能ですか?

のようなものobject_by_memoryadress(id(x)) == x

更新:これが必要な理由は、Pythonが埋め込まれたプログラムを使用しているためです。そして、このプログラムでは、相互に通信できるいわゆる「ノード」を作成できますが、整数、文字列などでのみ通信できますが、それらの間でリストを「転送」する必要があります(これは通常の方法では不可能です)。 )。

4

3 に答える 3

2

同時に実行されている異なるPythonプロセス間で情報を送信することが目標である場合は、マルチプロセッシングまたはセロリを確認してください。

任意のPythonオブジェクトを保存/復元/渡すことができるようにしたいだけの場合は、picklemarshalを確認してください。

これをしないでください、それは間違っていて悪いです!

>>> 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()あります。上記のように、スコープの名前空間を反復処理しているときにスコープに新しい名前を作成している場合は機能しません。それはおそらく他の十数の方法でも壊れています。

これをしないでください、それは間違っていて悪いです!

于 2011-08-19T09:18:40.090 に答える
1

私はそれを行うことができる機能に出くわしたことがありません。ただし、作成して保存するすべてのオブジェクトの内部インデックスとそのメモリアドレスを保持することはできます。次に、テーブルでルックアップを実行します。

于 2011-08-19T09:03:14.873 に答える
0

次のコードを含む共有ライブラリを作成しました。

#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()

これで、1つの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)
于 2011-11-09T22:11:36.837 に答える