我知道python是一种高级语言,管理内存分配等自己的用户/开发人员不需要像c,c ++等其他语言那样担心。
但是我们可以通过python
在特定的内存地址中写一些值吗?我知道id(),如果十六进制类型铸造可以给出十六进制位置,但我们如何在一个位置写。
答案 0 :(得分:2)
首先,正如评论中所指出的,这是一个很大的问题,为什么你会想要做这样的事情。你应该仔细考虑是否有其他选择。
话虽如此,通过扩展很容易实现。 Python本身的构建使extend it via C or C++变得容易。通过Cython更容易实现。
下面简要介绍如何使用整数p
和v
构建一个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]