#1 目的
Pythonコードを実施中に、コード内部の変数を外部からアクセスすることで変更したい。
#2 内容
Pythonコードを実行中に変数aを外部からアクセスし変更したい。下記のように、常にテキストファイル「TEST.txt」の内容を変数aに格納するコード(test1.py)を考える。ここでtest1.pyを実行中にTEST.txtの中身を変更したとしても、test1.py中の変数aの値は更新されない。(変更前のTEST.txtの値のままになってしまう)
#3 どのようにすればいいか
TEST.txtの内容をメモリに読み出す。test1.pyとtest2.pyはメモリを共有する。test1.pyは変数aにメモリの値を読み出している。test2.pyはメモリの値を変更する。test1.pyを実行すると常にメモリから値を読み取り変数aに格納する。test2.pyを実行すると、メモリの値が変更され、test1.pyはtest2.pyで更新された値を読み出す。
#4 コード
上記の動作を実現するコードを下記に載せます。
mmap.mmapを使います -> 読み込んだファイルの内容をメモリに格納することができます。
先にtest1.pyを動作させたあとにtest2.pyを駆動してください。
import mmap
with open("example.txt", "r+b") as f:
#mmap.mmap(fileno, length[, tagname[, access[, offset]]]) 指定されたファイルから length バイトをマップする。
#length が 0 の場合、マップの最大の長さは現在のファイルサイズになります。
mm = mmap.mmap(f.fileno(), 0) #ファイルの内容を読み出しmmに書き込む。mmはbitの列"01010101..." //mmap.mmap(fileno, length[, tagname[, access[, offset]]])
while True:
mm.seek(0) #メモリmmを頭から読み出し(seek(0))、読み出した値をmmに格納する。
mode=mm.readline() #メモリmmの内容を変数modeに書き出す。
print(mode)
import mmap
with open("example.txt", "r+b") as f:
#ファイルの内容を読み出しmmに書き込む。mmはbitの列"01010101..."
mm = mmap.mmap(f.fileno(), 0)
#メモリmmをb"01"に書き換える。example.txtのデータの長さが2なので書き込むデータの長さも2で指定する。example.txtのデータと違う長さのデータは書き込みできません。
mm[:] = b"01"
#データは2進数表記してください。メモリに書き込むため
00