繁体   English   中英

在python中写入内存中的特定地址

[英]Writing to particular address in memory in python

我知道 python 是一种高级语言,它自己管理内存分配等。与 c、c++ 等其他语言不同,它不需要担心太多。

但是有没有办法通过我们可以在python的特定内存地址中写入一些值

我知道 id() 如果十六进制类型转换可以给出十六进制位置,但我们如何在一个位置写入。

首先,正如评论中所指出的,这是一个相当大的问题,为什么你会想要做这样的事情。 您应该仔细考虑是否有其他选择。

话虽如此,通过扩展很容易做到这一点。 Python 本身经过构建,因此很容易通过 C 或 C++ 扩展它 通过Cython更容易做到。

下面概述了如何使用整数pv构建 Python 可调用函数。 它将值v写入数字地址为p的内存地址。

注意再次注意,这只是一个技术答案。 整个操作及其部分内容都存在问题,您应该考虑您要实现的目标。

创建一个文件modify.h ,内容为:

void modify(int p, int v);

创建一个文件modify.c ,内容为:

#include "modify.h"

void modify(int p, int v)
{
    *(int *)(p) = v;
}

创建一个文件modify.pyx ,内容为:

cdef extern from "modify.h"
     void modify(int p, int v)

def py_modify(p, v):
    modify(p, v)

最后,创建setup.py ,内容如下:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension(
    name="modify",
    sources=["modify.pyx", "modify.c"])]

setup(
    name = 'modify',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules,
    # ext_modules = cythonize(ext_modules)  ? not in 0.14.1
    # version=
    # description=
    # author=
    # author_email=
)

我希望您将此答案仅用于学习目的。

Python 本身不包含任何允许程序员直接访问内存的设施。 这意味着可悲(或高兴,取决于你的观点)你的问题的答案是“不”。

给定内存地址,您可以使用 ctypes 修改任何用户空间内存位置。

例如 numpy 数组公开数组缓冲区的原始地址,因此您可以像这样访问/修改值:

import numpy as np
import ctypes

a=np.random.rand(2,3)
addr=a.__array_interface__['data'][0]
p=ctypes.c_void_p(addr)
pf=ctypes.cast(p, ctypes.POINTER(ctypes.c_double))
assert pf[0] == a[0,0]
assert pf[1] == a[0,1]
assert pf[3] == a[1,0]

但是你不能轻易地将这个技巧应用到像 int 这样的普通 python 变量,因为 id() 返回 python 对象的起始地址,而不是存储值的确切位置,检查这个:

from ctypes import *
a=123456
p=cast(c_void_p(id(a)), POINTER(c_int))
print(p[:10])

从结果中我们可以看到该值实际上在偏移量 6*4=24

[1, 0, -1792371528, 127, 1, 0, 123456, 1, 1, 0]

我不能建议如何,但我知道(一)为什么。 直接写入寄存器允许设置特定的微控制器。 例如,配置端口或外围设备。 这通常是在 C 中完成的(更接近硬件),但如果您出于其他原因想使用 Python,这将是一个很好的功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM