如何使用从 C++ 发送的地址在 python 中获取值?
Posted
技术标签:
【中文标题】如何使用从 C++ 发送的地址在 python 中获取值?【英文标题】:how to get value in python using by the address of sent from c++? 【发布时间】:2019-11-07 08:06:19 【问题描述】:在 C++ 中,我采用一个 int 类型变量并将其地址传递给 python。地址是十六进制的,并作为字符串传递给 python。在python中,我将其转换为int类型并使用ctypes.cast()。但它崩溃了。
在python中,
class testClass:
def testMethod(actorArg, stringArg):
a = int(stringArg,16) #stringArg is the hex address in string type
print(type(a)) #gives int type
print(ctypes.cast(a, ctypes.py_object).value) #crashes!
基本想法来自我在 python 中执行此操作的这个 ctypes,
import ctypes
s = 10
print(id(s)) #gives the address of s
print(ctypes.cast(id(s), ctypes.py_object).value) #gives the value from address
简而言之,我想通过 c++ 发送的地址在 python 中获取价值。知道我在哪里做错了吗?提前致谢。
【问题讨论】:
您想将内存地址从一个可执行文件(用 c++ 编写)传递给另一个(用 python 编写)? 实际上我正在使用虚幻游戏引擎。我想将变量的地址从 C++ 传递到蓝图到 python。我可以将地址传递给python。但是从 python 中,我无法使用地址获取值。 Unreal内置了python。此外,ctypes.cast(obj,type)有什么问题。我还是不太明白。 这通常是不可能的[1]。当应用程序在操作系统中运行时,操作系统会为进程分配一个“应用程序空间”。在那里你可以声明数组,或者玩弄指针。指向一个应用程序的内存位置的指针对另一个应用程序没有意义。 [1] - 你需要一个类似shared memory
或pipe
的机制来进行进程间通信;查找如何为您的用例做到这一点。
@Roy2511 可能是,我没有正确理解 OP,但他声称:嵌入了 python 解释器。在这种情况下,Python 和 C++ 代码在同一个进程中运行。 (这是我们在应用程序中使用它的方式。)将地址作为十六进制字符串传递对我来说仍然有点令人费解,但在这种情况下它可以工作。
既然unreal已经嵌入了python,那么这里c++和python是使用不同的内存空间吗?如果内存相同,我需要一个变量从 c++ 函数传递给 python。但到目前为止我做不到。所以我的想法是从 C++ 传递内存地址,python 可以拥有它并使用该地址获取值。现在我可以将地址从 c++ 传递给 python(如字符串类型。出于某种原因,我必须将十六进制转换为字符串)。我想在 python 中使用它来从内存中获取值。
【参考方案1】:
如果a
是同一进程中某个C整数的正确地址,那么你要:
value = ctypes.c_int.from_address(a)
您的第二个代码适用于s
,因为s
是一个Python 整数,而不是一个C 整数,而id(s)
(在CPython 至少,作为实现细节),返回 Python 对象的地址。
【讨论】:
我得到 c_long(0)。我检查了 C++ 代码。我在那里初始化了一个整数并以字符串格式将地址传递给python。该地址在 C++ 中是 000000EC6AEC9B58,在 python 中是相同的。 @arafat 使用可重现的代码更新您的问题。这是正确的代码如果地址正确并且是相同的过程。 @arafat 另外,变量还在作用域内吗?再次尝试代码的可重现示例会有所帮助。以上是关于如何使用从 C++ 发送的地址在 python 中获取值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ZeroMQ 从 C# 客户端向 C++ 服务器发送消息