[英]Writing to particular address in memory in python
我知道 python 是一種高級語言,它自己管理內存分配等。與 c、c++ 等其他語言不同,它不需要擔心太多。
但是有沒有辦法通過我們可以在python的特定內存地址中寫入一些值
我知道 id() 如果十六進制類型轉換可以給出十六進制位置,但我們如何在一個位置寫入。
首先,正如評論中所指出的,這是一個相當大的問題,為什么你會想要做這樣的事情。 您應該仔細考慮是否有其他選擇。
話雖如此,通過擴展很容易做到這一點。 Python 本身經過構建,因此很容易通過 C 或 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=
)
我希望您將此答案僅用於學習目的。
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.