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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Raspberry Pi

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

Python

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

Q&A

解決済

1回答

28206閲覧

SyntaxError: 'return' outside function エラー原因

horisuke3232

総合スコア109

Raspberry Pi

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

Python

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

0グッド

1クリップ

投稿2016/08/22 20:38

編集2016/08/22 22:49

raspberry Pi を使って人感センサーに反応したらiPhoneにお知らせする物を作りたいと思い、調べたところ下記のサイトを発見しました。
https://www.sho-yamane.me/entry/2015/06/07/195407
こちらを参考にgmailのアドレス、パスワードを変更して実行してみたのですが、

python

1line 52 2 return msg 3 SyntaxError: 'return' outside function

とエラーが表示されます。

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3from __future__ import print_function 4import os.path 5import datetime 6import smtplib 7import socket 8import time 9import RPi.GPIO as GPIO 10GPIO.setmode(GPIO.BCM) 11GPIO.setup(25, GPIO.IN) 12from contextlib import closing 13from email import Encoders 14from email.Utils import formatdate 15from email.MIMEBase import MIMEBase 16from email.MIMEMultipart import MIMEMultipart 17from email.MIMEText import MIMEText 18 19#Gmailアカウント 20ADDRESS = "アドレス" 21PASSWARD = "パスワード" 22 23#SMTPサーバの設定(Gmail用) 24SMTP = "smtp.gmail.com" 25PORT = 587 26def create_message(from_addr, to_addr, subject, body, mime=None, attach_file=None): 27 """ 28 メッセージを作成する 29 @:param from_addr 差出人 30 @:param to_addr 宛先 31 @:param subject 件名 32 @:param body 本文 33 @:param mime MIME 34 @:param attach_file 添付ファイル 35 @:return メッセージ 36 """ 37 msg = MIMEMultipart() 38 msg["From"] = from_addr 39 msg["To"] = to_addr 40 msg["Date"] = formatdate() 41 msg["Subject"] = subject 42 body = MIMEText(body) 43 msg.attach(body) 44 45# 添付ファイル 46 if mime != None and attach_file != None: 47 attachment = MIMEBase(mime['type'],mime['subtype']) 48 file = open(attach_file['path']) 49 attachment.set_payload(file.read()) 50 file.close() 51 Encoders.encode_base64(attachment) 52 msg.attach(attachment) 53 attachment.add_header("Content-Disposition","attachment", filename=attach_file['name']) 54 55 return msg 56 57 58 if mime != None and attach_file != None: 59 attachment = MIMEBase(mime['type'],mime['subtype']) 60 file = open(attach_file['path']) 61 attachment.set_payload(file.read()) 62 file.close() 63 Encoders.encode_base64(attachment) 64 msg.attach(attachment) 65 attachment.add_header("Content-Disposition","attachment", filename=attach_file['name']) 66 67 return msg 68 69def send(from_addr, to_addrs, msg): 70 """ 71 メールを送信する 72 @:param from_addr 差出人 73 @:param to_addr 宛先(list) 74 @:param msg メッセージ 75 """ 76 smtpobj = smtplib.SMTP(SMTP, PORT) 77 smtpobj.ehlo() 78 smtpobj.starttls() 79 smtpobj.ehlo() 80 smtpobj.login(ADDRESS, PASSWARD) 81 smtpobj.sendmail(from_addr, to_addrs, msg.as_string()) 82 smtpobj.close() 83 84if __name__ == '__main__': 85#宛先アドレス 86 to_addr = "アドレス" 87#件名と本文 88 subject = "侵入者あり!" 89 body = "たった今侵入者がありました!警戒してください!" 90#添付ファイル設定(text.txtファイルを添付) 91 mime={'type':'text', 'subtype':'comma-separated-values'} 92 attach_file={'name':'test.txt', 'path':'./text.txt'} 93#メッセージの作成(添付ファイルあり) 94#msg = create_message(ADDRESS, to_addr, subject, body, mime, attach_file) 95#メッセージ作成(添付ファイルなし) 96while True: 97 inputValue = GPIO.input(25) 98if (inputValue == True): 99 msg = create_message(ADDRESS, to_addr, subject, body) 100 send(ADDRESS, [to_addr], msg) 101 time.sleep(1)

何が原因なのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

Pythonはインデントを正しく書かないと動作しないのはご存知でしょうか?

以下の記事の

Pythonを始めよう (1/5):CodeZine(コードジン)
https://codezine.jp/article/detail/1617

ブロックは全てインデントで記述する

の箇所を読んでみて下さい。

codeのマークアップがされているようなので、タブ文字でもないですよね。
正しいインデントを適用して、それを実行してみて下さい。

それでも上手く行かないようでしたら、この質問のコードを修正したものに置き換えてから、もういちど聞いてください。


(追記)

後半は、たぶんこうするのが正しいと思います。

lang

1if __name__ == '__main__': 2 #宛先アドレス 3 to_addr = "アドレス" 4 #件名と本文 5 subject = "侵入者あり!" 6 body = "たった今侵入者がありました!警戒してください!" 7 #添付ファイル設定(text.txtファイルを添付) 8 mime={'type':'text', 'subtype':'comma-separated-values'} 9 attach_file={'name':'test.txt', 'path':'./text.txt'} 10 #メッセージの作成(添付ファイルあり) 11 #msg = create_message(ADDRESS, to_addr, subject, body, mime, attach_file) 12 #メッセージ作成(添付ファイルなし) 13 while True: 14 inputValue = GPIO.input(25) 15 if (inputValue == True): 16 msg = create_message(ADDRESS, to_addr, subject, body) 17 send(ADDRESS, [to_addr], msg) 18 time.sleep(1)

投稿2016/08/22 21:32

編集2016/08/22 22:58
argius

総合スコア9388

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

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

horisuke3232

2016/08/22 22:51

回答ありがとうございました。 わかりやすいサイトの紹介もありがとうございました。 無事原因が特定できました。 コード修正し表記しました。 別な質問となってしまうのですが、上記のコードで実行したところ、空白のまま何も動作がありません。 人感センサーを動かしてみましたが、メールが送信されませんでした。 なぜなんでしょうか?
argius

2016/08/22 23:00

修正例を記載しました。 これは元のコード例が良くないですね。 わざとなのかどうかわかりませんが。 Pythonは、コードをサイトに掲載する際にこの手の問題がつきまといますので、ご注意ください。 teratailでも質問にインデントの無いコードが貼られることが良くあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問