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

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

新規登録して質問してみよう
ただいま回答率
85.48%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 3.x

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

4回答

3668閲覧

Python if文 trueでないのにelseに飛ばない

DMC

総合スコア18

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 3.x

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/01/31 15:55

編集2020/02/01 10:45

Python3に詳しい方に質問です。

以下コードの様にif文を使用して
(bd in res.decode())がtrueでなければelse以降に飛んで欲しいのですがtrueでなければ通らないはずのif下のres〜のところでエラー
が出ます。

(bd in〜)という条件は「hcitool con」を使用したBluetoothが接続されているかどうかという条件なのですが、接続されてない状態だとres〜の所でエラーが出るのはわかっているので、未接続ならres〜を飛ばしてelse以降に飛んでその先で接続トライさせたいです。ダメならwhileによってループしてres〜を通らずに接続トライを繰り返す様にしたいです。
true(接続)になればif下を通りres〜も通ってRSSIを表示させたいと思ってます。

なぜtrue(Bluetooth接続)でないのにelseに飛ばずif文の下を通ってしまうのか教えていただきたいです。

ご教授よろしくお願いします。

以下コードです。

#coding: utf-8 import subprocess import csv import datetime from time import sleep record_file_name = 'blt_detect.csv' bltcount = 0 try: while True: record_datetime = datetime.datetime.now() record_time = record_datetime.strftime('%Y%m%d-%X') cmd = 'hcitool con' res = subprocess.check_output(cmd.split()) print(res) bd = 'B4:8B:11:11:11:11' if(bd in res.decode()): cmd = 'hcitool rssi B4:8B:11:11:11:11' res = subprocess.check_output(cmd.split()) print(res) else: p1 = subprocess.Popen(["echo","connect",bd], stdout=subprocess.PIPE) p2 = subprocess.Popen(["bluetoothctl"], stdin=p1.stdout, stdout=subprocess.PIPE) p1.stdout.close() outs,errs = p2.communicate() print('Attempt to connect...') bltcount =0 sleep(5) except error: pass

===============================
エラー内容

line25は上記のhcitool rssiの下行のres~です。

b'Connections:\n' Attempt to connect... b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 0 state 5 lm MASTER \n' Read RSSI failed: Input/output error Traceback (most recent call last): File "car_LED2.py", line 25, in <module> res = subprocess.check_output(cmd.split()) File "/usr/lib/python3.7/subprocess.py", line 395, in check_output **kwargs).stdout File "/usr/lib/python3.7/subprocess.py", line 487, in run output=stdout, stderr=stderr) subprocess.CalledProcessError: Command '['hcitool', 'rssi', 'B4:8B:11:11:11:11']' returned non-zero exit status 1. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "car_LED2.py", line 44, in <module> except error: NameError: name 'error' is not defined

ちなみに接続時は以下のように出力されます。

pi@DMC:~ $ sudo python3 "car_LED2.py"
b'Connections:\n'
Attempt to connect...
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 16\n'
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 21\n'
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 17\n'
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 16\n'
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 22\n'
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 16\n'
b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 12 state 1 lm SLAVE AUTH ENCRYPT \n'
b'RSSI return value: 0\n'

接続が切れるとエラーが発生しループも止まります。

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

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

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

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

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

Nippun

2020/01/31 16:34

インデントがあるかないかで意味が変わるので入れてください
thkana

2020/01/31 23:01

> 見やすい様にインデント無くして左に詰めてます Pythonの最初から復習してください...Pythonではインデントが意味を持つので、無くしたらプログラムが成り立ちません。 投稿の際には、 https://teratail.com/questions/238564 とか https://teratail.com/questions/120868#reply-184015 あたりを参考に、codeタグを使ってインデントが保存されるように投稿してください。
thkana

2020/02/01 00:11

インデントが片付いたら > なぜtrue(Bluetooth接続)でないのに trueでないことをどのように「確認したか」を追記してください。(trueでない「はず」ではダメです)
meg_

2020/02/01 01:02

・コードは「コードの挿入」で記入してください。今のままではコードが非常に読みにくいです。 ・print()の出力結果も質問に載せてください。
DMC

2020/02/01 03:59

ご指導ありがとうございます。 読みづらいとは思いますがコードとエラーを載せさせていただきました。 やりたい事は車に接続させているラズパイでPython3のプログラムを起動させておいてiPhoneが近づいたらLEDを点灯させたいのですがRSSIを条件に入れたいと思ってます。 でないとリビングと駐車場が近くて常にLEDが点灯する事になってしまうからです。 https://non-it-engineer.com/?p=442&unapproved=9&moderation-hash=744c49f1a81e07808e362ddc160b5e50#comment-9 のコードを参考にさせていただきラズパイにiPhoneを近づけたらBluetooth接続までは出来ましたので現在RSSIをどうやってコードに含めれば良いか考察中です。 エラーはiPhoneのBluetoothをOFFにしてデバイスBluetooth圏外状態にすると発生します。 圏内で接続状態であると定期的にRSSIを出力してくれます。 なのでif文で接続してなければline25を通らない様にしたいのですが上手くいきません。 何かと間違った解釈、理解が元で意味不明な事を言っているかもしれませんがアドバイスよろしくお願いします。
guest

回答4

0

結局、何某らかのタイミングの問題かと思い初めのcmd=hcitool con(16行目?)の前にsleep(5)を追加したらBluetooth off時にアドレスを読み取る事なくelseに飛んでくれてRSSI読み取りエラーが出なくなりました。

皆様からのいろいろなアドバイス、情報のおかげで解決できたと感謝しております。

今後も初心者ならではの情けない質問をするかもしれませんが極力迷惑をかけない様に勉強を進めていきます。

ありがとうございました。
今後ともよろしくお願いします。

投稿2020/02/01 14:45

DMC

総合スコア18

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

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

0

「b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 0 state 5 lm MASTER \n'」
という表示は、

cmd = 'hcitool con'

の2行下にある

print(res)

によって表示された文字列resの内容で、bluetoothによる接続が成功していることを示しています。

文字列resの中には、変数bdの内容である'B4:8B:11:11:11:11'が含まれていますから、

if(bd in res.decode()):

というif文の条件「bd in res.decode()」はTrueになります。

要は、『if文 の条件がtrueだったので、elseに飛ばなかった』という当たり前の事が起きた。

==

「RSSIを表示させたいと思ってます」については、

Read RSSI failed: Input/output error

とのエラーメッセージが出ていますから、RSSIの取得に失敗しています。

これは接続しようとしている機器がBluetooth LEであるための可能性が考えられます。

Bluetooth LEでRSSIを取得する方法については、teratailで解決済みになっているBluetooth LEでRSSI値を取得したいという質問が参考になると思います。

投稿2020/02/01 05:11

coco_bauer

総合スコア6915

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

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

DMC

2020/02/01 11:00

ご回答ありがとうございます。 確かに 「b'Connections:\n\t< ACL B4:8B:11:11:11:11 handle 0 state 5 lm MASTER \n'」 と出ているので条件trueでelseに飛ばないのは理解できます。しかしながら謎なのはiPhoneのBluetoothを完全にoffにしているのになぜhcitool conでアドレスが出力されてしまうのか?trueで条件の下段に進んでしまうとhcitool rssiはBluetooth offなので出力無しでエラーになるのは当然ですね。 hcitool conについてもっと調べてみたいと思います。
guest

0

ベストアンサー

なぜtrue(Bluetooth接続)でないのにelseに飛ばずif文の下を通ってしまうのか

の理由についてだけ。

エラー内容を見る限りhcitool conが2回実行されているようです。
1回目の結果はConnections:\nB4:8B:11:11:11:11は含まれていませんが
2回目の結果はConnections:\n\t< ACL B4:8B:11:11:11:11 handle 0 state 5 lm MASTER \nとなっておりB4:8B:11:11:11:11が含まれるためにtrueになっています。

投稿2020/02/01 04:23

can110

総合スコア38266

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

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

DMC

2020/02/01 04:41

ご回答ありがとうございます。 iPhoneのBluetoothをOFFにした状態なのになぜ読み取ってしまっているか調査を続けます。
guest

0

Traceback (most recent call last):

File "car_LED2.py", line 44, in <module>
except error:
NameError: name 'error' is not defined

上記エラーを解消するために下記としてください。

Python

1except:

投稿2020/02/01 04:13

meg_

総合スコア10580

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

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

meg_

2020/02/01 04:16

まず、エラーを1つ解消してから再度コードを実行してどうなるか教えてください。
DMC

2020/02/01 06:22

ご回答ありがとうございます。 ご指示通り:の位置を変更しましたが変わらず NameError: name ‘error’ is not definedが発生しました。 ベースにさせていただいたコードから自分なりにtry-except文を調べて安易にerrorと打ち込みましたがそもそもerrorなんていう名前がおかしいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問