簡體   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