質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1306閲覧

Python ソースコードの意味

raspypy

総合スコア247

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/27 03:08

##わからないこと

次のサイトに掲載されているソースコードを使おうとしていますが,
https://github.com/AmbientDataInc/LoRa-rssi-measure/blob/master/RPi3/main.py
あらかじめソースコードの意味を理解しようとしています.

どうしても分からない部分があり,教えていただけると助かります.

86行目,126行目
sys.stdout.flush()
とありますが,
その前に,
出力先の設定sys.stdout=xxxが定義されていませんし,
出力sys.stdout.writeの記述もありません.

なぜ,ここでflush()がされているのかが分からず困っています.
(ちなみにソースコードの作者にも質問してみましたが,質問を受け付けてもらえませんでした.)

##ソースコード

python

1# sf, bwを変えながら移動端末から受信する 2# 3# LoRaモジュールから1行読み、rssi、panid、srcid、msgに分解 4# さらにmsgが'latlng=(lat,lng)'という形式なので、'(lat,lng)'部分をTupleに変換 5# rssiを保存し、Ambientに送信 6# 7# 8 9import lora 10import ast 11import time 12import struct 13import sys 14import ambient 15 16# (bw, sf, timeout) 17mode = [ 18 (3, 12, 5), (3, 11, 5), (3, 10, 4), (3, 9, 3), (3, 8, 2), (3, 7, 2), 19 (4, 12, 5), (4, 11, 4), (4, 10, 3), (4, 9, 3), (4, 8, 2), (4, 7, 2), 20 (5, 12, 4), (5, 11, 3), (5, 10, 2), (5, 9, 2), (5, 8, 2), (5, 7, 2), 21 (6, 12, 3), (6, 11, 3), (6, 10, 2), (6, 9, 2), (6, 8, 2), (6, 7, 2) 22] 23 24channelId1 = チャネルID1 25writeKey1 = 'ライトキー1' 26channelId2 = チャネルID2 27writeKey2 = 'ライトキー2' 28channelId3 = チャネルID3 29writeKey3 = 'ライトキー3' 30channelId4 = チャネルID4 31writeKey4 = 'ライトキー4' 32 33am1 = ambient.Ambient(channelId1, writeKey1) 34am2 = ambient.Ambient(channelId2, writeKey2) 35am3 = ambient.Ambient(channelId3, writeKey3) 36am4 = ambient.Ambient(channelId4, writeKey4) 37 38lr = lora.LoRa() 39 40def printable(l): 41 x = struct.unpack(str(len(l)) + 'b', l) 42 y = '' 43 for i in range(len(x)): 44 if x[i] >= 0: 45 y = y + chr(x[i]) 46 return y 47 48def sendcmd(cmd): 49 # print(cmd) 50 lr.write(cmd) 51 t = time.time() 52 while (True): 53 if (time.time() - t) > 5: 54 print('panic: %s' % cmd) 55 exit() 56 line = lr.readline() 57 if 'OK' in printable(line): 58 # print(line) 59 return True 60 elif 'NG' in printable(line): 61 # print(line) 62 return False 63 64def setMode(bw, sf): 65 lr.write('config\r\n') 66 lr.s.flush() 67 time.sleep(0.2) 68 lr.reset() 69 time.sleep(1.5) 70 71 line = lr.readline() 72 while not ('Mode' in printable(line)): 73 line = lr.readline() 74 if len(line) > 0: 75 print(line) 76 77 sendcmd('2\r\n') 78 sendcmd('bw %d\r\n' % bw) 79 sendcmd('sf %d\r\n' % sf) 80 sendcmd('q 2\r\n') 81 sendcmd('w\r\n') 82 83 lr.reset() 84 print('LoRa module set to new mode') 85 time.sleep(1) 86 sys.stdout.flush() 87 88while (True): 89 rssi = [None] * len(mode) 90 latlng = () 91 for i in range(len(mode)): 92 print('setMode(bw: %d, sf: %d)' % (mode[i][0], mode[i][1])) 93 setMode(mode[i][0], mode[i][1]) 94 95 t = None if i == 0 else mode[i][2] 96 timeout = False 97 start = time.time() 98 while (True): 99 while (True): 100 line = lr.readline(t) 101 # print(line) 102 # sys.stdout.flush() 103 if len(line) == 0: # TIMEOUT 104 timeout = True 105 break 106 if len(line) >= 14: # 'rssi(4bytes),pan id(4bytes),src id(4bytes),\r\n'で14バイト 107 break 108 if timeout == True: 109 rssi[i] = None 110 print('TIMEOUT') 111 break; 112 data = lr.parse(line) # 'rssi(4bytes),pan id(4bytes),src id(4bytes),laglng=(12バイト,12バイト)\r\n', ペイロード34バイト 113 print(data) 114 if 'loc=' in data[3]: 115 loc = ast.literal_eval(data[3].split('=')[1]) 116 rssi[i] = data[0] 117 latlng = loc 118 s = mode[i][2] - (time.time() - start) 119 # print('sleep: ' + str(s)) 120 if i != 0 and s > 0: 121 time.sleep(s) 122 break 123 124 print(rssi) 125 print(latlng) 126 sys.stdout.flush() 127 128 am1.send({'d1': rssi[5], 'd2': rssi[4], 'd3': rssi[3], 'd4': rssi[2], 'd5': rssi[1], 'd6': rssi[0], 'lat': latlng[0], 'lng': latlng[1]}) 129 am2.send({'d1': rssi[11], 'd2': rssi[10], 'd3': rssi[9], 'd4': rssi[8], 'd5': rssi[7], 'd6': rssi[6], 'lat': latlng[0], 'lng': latlng[1]}) 130 am3.send({'d1': rssi[17], 'd2': rssi[16], 'd3': rssi[15], 'd4': rssi[14], 'd5': rssi[13], 'd6': rssi[12], 'lat': latlng[0], 'lng': latlng[1]}) 131 am4.send({'d1': rssi[23], 'd2': rssi[22], 'd3': rssi[21], 'd4': rssi[20], 'd5': rssi[19], 'd6': rssi[18], 'lat': latlng[0], 'lng': latlng[1]})

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

pepperleafさんが書かれているように、sys.stdoutは、print関数などが使用する出力です。

したがってsys.stdoutを変更すればprint関数は別のストリームに出力します。
以下の実行結果を見れば意味が分かるでしょう。

python

1>>> import sys 2>>> sys.stdout 3<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> 4>>> import io 5>>> stdout_bkup = sys.stdout 6>>> with io.StringIO() as f: 7... sys.stdout = f 8... print('Hello Python!!') 9... outdata = f.getvalue() 10... 11>>> sys.stdout = stdout_bkup 12>>> print(outdata) 13Hello Python!!

sys.stdout.flush()をするのは、プロセス間通信のように、バッファリングが邪魔になるときです。

投稿2021/06/27 03:49

編集2021/06/27 04:55
ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sys.stdoutについて調べられましたか?
例えば、 sys --- システムパラメータと関数 の sys.stdout の項目。

標準出力で、プラットフォーム依存とありますが、まあ、大抵はコンソールへの出力。
大抵の環境では、flush()なんてしなくてもよい事が多いですが、おまじないみたいにする事も多いです。
(提示のソースでの必要性は未確認)

ソースコードの作者にも質問してみました

標準機能に関する質問なので、よっぽど親切な方でないとこの手の質問に答えるのは面倒に思うかも知れません。(多分)

投稿2021/06/27 03:20

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raspypy

2021/06/27 03:32

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問