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

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

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

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

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

Q&A

解決済

2回答

556閲覧

電源起動時のPythonの自動実行に関して

yabutanita

総合スコア7

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Raspberry Pi

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

0グッド

0クリップ

投稿2018/04/05 03:15

前提・実現したいこと

RaspberryPi3、Python2.7を使用しております。
RaspberryPi3が起動したら自動で下記の処理が開始され、きちんと動作できるようにしたい。

機械に取り付けて、GPIOを通じてエラー信号を受け取ったときとエラー信号を解除した際に
関係者にメールを送れるようにしたい。

発生している問題・エラーメッセージ

使用しているプログラム名 同じディレクトリ内で存在
・GPIO_input_signal.py → メインプログラム
・send_error_info.py → エラー信号受信時のメール送信プログラム
・send_reboot_info.py → エラー信号解除時のメール送信プログラム

Pythonの所定のコードをsystemctlで自動起動するように設定をしているのですが、
エラー信号を拾っても、解除してもメールの送信がされません。

該当のソースコード

◆/etc/systemd/system/test.service [Unit] Description = Test [Service] ExecStart=/usr/bin/python2.7 /home/pi/NatMachine_system/GPIO_input_signal.py Restart=always Type=simple [Install] WantedBy=multi-user.target ◆GPIO_input_signal.py python import RPi.GPIO as GPIO import time import subprocess GPIO.setmode(GPIO.BCM) pin = 24 ref = 0 def callBack_action(pin): if GPIO.input(pin): print("on") else: ref = 0 GPIO.setup(pin, GPIO.IN, GPIO.PUD_DOWN) GPIO.add_event_detect(pin, GPIO.BOTH, callback=callBack_action, bouncetime=500) try: while(True): if ref == 1 and GPIO.input(pin) == 1: # print("continue palse") time.sleep(10) elif ref == 0 and GPIO.input(pin) == 1: # print("palse up") time.sleep(10) subprocess.check_call(['python','send_error_info.py']) ref = 1 elif ref == 1 and GPIO.input(pin) == 0: # print("palse down") time.sleep(10) subprocess.check_call(['python','send_reboot_info.py']) ref = 0 else: # print("no pulse") time.sleep(10) except KeyboardInterrupt: print "break" GPIO.cleanup()

試したこと

プログラムが起動時に起動しているか確認したが一応動いているみたいです。

ps -ax | grep python で確認してもきちんと起動しております
4469 ? Ssl 0:00 /usr/bin/python2.7 /home/pi/NatMachine_system/GPIO_input_signal.py

systemctl status test.service で確認しても起動しております。
● test.service - Test
Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: enabled)
Active: active (running) since
Main PID: 4801 (python2.7)
CGroup: /system.slice/test.service
mq4801 /usr/bin/python2.7 /home/pi/Machine/GPIO_input_signal.py

4月 05 12:00:49 raspberrypi systemd[1]: Started Test.

teratarmを使用し、プログラムを走らせるときちんと動作します。

自動起動で問題があるかと思うのですが、原因が見出せません。
どなたかご教授頂いてよろしいでしょうか。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

subprocess.check_call(['python','send_error_info.py'])

subprocess.check_call(['python','send_reboot_info.py'])

上記2か所において、スクリプトが見つからないのが原因かと思われます。

以下のように、フルパスで記載してみてください。

Python

1subprocess.check_call(['/usr/bin/python','/home/pi/NatMachine_system/send_error_info.py']) 2subprocess.check_call(['/usr/bin/python','/home/pi/NatMachine_system/send_reboot_info.py'])

投稿2018/04/05 04:01

kazto

総合スコア7196

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

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

yabutanita

2018/04/05 04:38

ご回答ありがとうございます! 上記のプログラムに修正したところ無事稼働致しました!
guest

0

カレントディレクトリが違うのが原因じゃ。
それがどこにあるのかプリントさせるなりしてチェックしよう

投稿2018/04/05 03:21

編集2018/04/05 03:22
y_waiwai

総合スコア87719

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

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

yabutanita

2018/04/05 03:57

申し訳ありません。 変にカモフラージュしようとしたため、誤記がありました。 mq4801 /usr/bin/python2.7 /home/pi/Machine/GPIO_input_signal.py ↓ mq4801 /usr/bin/python2.7 /home/pi/NatMachine_system/GPIO_input_signal.py この部分ではないカレントディレクトリでしょうか?
y_waiwai

2018/04/05 04:01

カレントディレクトリはコードのあるディレクトリにはなりません。 同じディレクトリにあるからといってファイル名だけの記述では見つけられませんね。 フルパスで記述するか、カレントディレクトリを希望のものに設定する必要があります
y_waiwai

2018/04/05 04:14

別回答にあるように、まずは全てフルパスで記述して動かせてみましょう。 それできちんと動くのなら、カレントディレクトリの問題、ということがはっきりするでしょう
yabutanita

2018/04/05 04:37

ご回答ありがとうございます 理解でき、無事動作できました! ありがとうございます。
y_waiwai

2018/04/05 04:41

フルパスにしてそんでいいんかい!という気はしますが、 無事動作おめでとうw
yabutanita

2018/04/05 06:13

コメントありがとうございます。 後学のために教えていただきたいです。 pythonプログラム内に import os os.chdir("/home/pi/NatMachine_system/") を記述して、作業ディレクトリで処理を行うようなイメージでしょうか?
y_waiwai

2018/04/05 06:41

実行ファイルのフルパスが __file__ で取れるので、そのディレクトリを分離してカレントディレクトリに設定、とすれば決め打ちはなくなるのでよろしいかと思います
yabutanita

2018/04/06 02:56

ご回答ありがとうございます。 一度試してみます!
y_waiwai

2018/04/06 03:01

フルパスで指定してると、ちょっと環境変えるとか、別のマシンに持っていって動かせるという場合に、わざわざそのディレクトリ作ってそこにコード入れて、とすると使い勝手は悪くなりますんで(まあしかし、そういう運用もありかとは思いますが) とにかくメインのスクリプトと同じ場所に突っ込んどけば動く、というふうにするほうがいいですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問