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

时间:2016-08-01 10:30:35

标签: python python-2.7

我知道python是一种高级语言,管理内存分配等自己的用户/开发人员不需要像c,c ++等其他语言那样担心。

但是我们可以通过python

在特定的内存地址中写一些值吗?

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

4 个答案:

答案 0 :(得分:2)

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

话虽如此,通过扩展很容易实现。 Python本身的构建使extend it via C or 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=
)

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

答案 1 :(得分:1)

Python本身不包含允许程序员直接访问内存的任何工具。这意味着可悲的是(或者很高兴,取决于你的观点)你的问题的答案是"没有"。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

给定内存地址,您可以使用 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]