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

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

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

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

Python

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

Q&A

解決済

1回答

16234閲覧

【python】pip install scheduleでインストールしたモジュールが読み込まれない

morutemu

総合スコア45

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2018/05/11 21:02

編集2018/05/11 22:44

OS:Raspberry pi

pip install schedule

にてモジュールをインストールしたのですが、
.serviceファイルで起動時にpythonプログラムを起動させると
importエラーになります。
お力下さい。

今までの質問の経緯
https://teratail.com/questions/125361

GarbageDayReminder.py
場所:/opt/GarbageDayReminder/GarbageDayReminder.py

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4# +++ モジュール +++ 5from threading import Thread 6import RPi.GPIO as GPIO 7import datetime 8import schedule 9import pandas 10import time 11import csv 12import os 13 14# +++ 変数 +++ 15# リマインド時間 16spc_time = "7:20" 17 18# 確認時間 19start_time = "00:00:00" 20end_time = "08:30:00" 21 22# +++ クラス +++ 23class GarbageDayReminder(object): 24 # イニシャライズ 25 def __init__(self): 26 pass 27 28 # 日付処理 29 def date(self): 30 # 変数 31 FormatDay = "%Y/%m/%d " 32 FormatTime = "%H:%M:%S" 33 34 # 今日の日時を取得 35 now = datetime.datetime.now() 36 37 # 明日の日時を取得 38 tmr = now + datetime.timedelta(days=1) 39 40 # 1990-01-01対策の現在日付を追加 41 date = now.strftime(FormatDay) 42 43 # 今日、明日を振り分ける時間を作成 44 start = datetime.datetime.strptime(date + start_time, FormatDay + FormatTime) 45 end = datetime.datetime.strptime(date + end_time, FormatDay + FormatTime) 46 47 # 今日、明日日付取得の分岐 48 if start <= now <= end: 49 # 今日日付の取得 50 today = "{}/{}/{}".format(now.year, now.month, now.day) 51 return today ,"today" 52 else: 53 # 明日の日付を取得 54 tommorow = "{}/{}/{}".format(tmr.year, tmr.month, tmr.day) 55 return tommorow ,"tommorow" 56 57 # csv処理 58 def csv(self,date): 59 # データが格納されている作業ディレクトリまでパス指定 60 os.chdir("/opt/GarbageDayReminder") 61 62 # csvファイルを読み込む 63 df = pandas.read_csv("garbage_day.csv") 64 65 # 何のゴミの日か取得 66 garbage = df[df["日付"] == date]["ゴミ"].values[0] 67 68 return garbage 69 70 # リマインダー処理 71 def reminder(self, now, garbage): 72 # 辞書 73 gb_dict = {"燃":"燃やすごみ",\ 74 "不":"燃やさないごみ",\ 75 "缶":"空き缶、スプレー缶、空きびん、廃蛍光管",\ 76 "資":"プラスチック製容器梱包、ペットボトル",\ 77 "紙":"紙類ごみ",\ 78 "草":"せんてい枝、庭の草", \ 79 "粗":"粗大ごみ"} 80 81 # 今日、明日の切替 82 if now == "today": 83 now = "今日" 84 elif now == "tommorow": 85 now = "明日" 86 else: 87 return 88 89 # リマインド 90 if garbage in gb_dict: 91 msg = "/opt/jtalk/jtalk.sh " + "ぽーーん!" + now + "は" + gb_dict[garbage] + "の日です" 92 os.system(msg) 93 else: 94 msg = "/opt/jtalk/jtalk.sh " + "ぽーーん!" + now + "のごみの日はありません" 95 os.system(msg) 96 97 # 中間処理 98 def intermediate(self): 99 # 日付処理 100 date, now = gdr.date() 101 102 # csv処理 103 garbage = gdr.csv(date) 104 105 # リマインダー処理 106 gdr.reminder(now, garbage) 107 108 # 指定時間処理 109 def specified_time(self): 110 # 指定時間に中間処理を実行 111 schedule.every().day.at(spc_time).do(gdr.intermediate) 112 while True: 113 schedule.run_pending() 114 time.sleep(1) 115 116 # チェック処理 117 def button(self): 118 GPIO.setmode(GPIO.BCM) 119 120 #GPIO12pinを入力モードとし、pull up設定とします 121 GPIO.setup(12,GPIO.IN,pull_up_down=GPIO.PUD_UP) 122 123 while True: 124 GPIO.wait_for_edge(12, GPIO.FALLING) 125 sw_counter = 0 126 127 while True: 128 sw_status = GPIO.input(12) 129 if sw_status == 0: 130 sw_counter = sw_counter + 1 131 if sw_counter >= 30: 132 print("長押し") 133 gdr.intermediate() 134 break 135 else: 136 print("短押し") 137 break 138 139 time.sleep(0.01) 140 141 print(sw_counter) 142 143 # メイン処理 144 def main(self): 145 # 指定時間処理(マルチスレッド) 146 t = Thread(target=gdr.specified_time) 147 t.start() 148 149 # デバッグ用 150 #gdr.intermediate() 151 152 # ボタン処理 153 gdr.button() 154 155# +++ 初期動作 +++ 156if __name__ == "__main__": 157 # GarbageDayReminderクラスをインスタンス化して実行 158 gdr = GarbageDayReminder() 159 gdr.main()

GarbageDayReminder.service
場所:/etc/systemd/system/GarbageDayReminder.service

service

1[Unit] 2Description = GarbageDayReminder 3 4[Service] 5ExecStart = /usr/bin/env python /opt/GarbageDayReminder/GarbageDayReminder.py 6Restart = always 7Type = simple 8 9[Install] 10WantedBy = multi-user.target

追加

エラー
場所:/var/log/syslog

May 11 20:09:46 raspberrypi env[457]: Traceback (most recent call last): May 11 20:09:46 raspberrypi env[457]: File "/opt/GarbageDayReminder/GarbageDayReminder.py", line 8, in <module> May 11 20:09:46 raspberrypi env[457]: import schedule May 11 20:09:46 raspberrypi env[457]: ImportError: No module named schedule May 11 20:09:46 raspberrypi systemd[1]: GarbageDayReminder.service: Main process exited, code=exited, status=1/FAILURE May 11 20:09:46 raspberrypi systemd[1]: GarbageDayReminder.service: Unit entered failed state. May 11 20:09:46 raspberrypi systemd[1]: GarbageDayReminder.service: Failed with result 'exit-code'. May 11 20:09:46 raspberrypi dphys-swapfile[357]: Starting dphys-swapfile swapfile setup ... May 11 20:09:46 raspberrypi systemd[1]: Started Raise network interfaces. May 11 20:09:46 raspberrypi systemd[1]: GarbageDayReminder.service: Service hold-off time over, scheduling restart. May 11 20:09:46 raspberrypi systemd[1]: Stopped Garbage Day Reminder. May 11 20:09:46 raspberrypi systemd[1]: Started Garbage Day Reminder.

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

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

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

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

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

tachikoma

2018/05/11 22:24

エラーのスタックトレースを追記お願いします。
morutemu

2018/05/11 22:44

エラーを追記しました。
hichon

2018/05/11 23:13

Pythonが複数インストールされていて、モジュールが別の場所にインストールされていませんか?
hichon

2018/05/11 23:14

ls -l `which pip`の結果を確認して下さい。
morutemu

2018/05/11 23:16

-rwxr-xr-x 1 root root 292 9月 25 2017 /usr/bin/pipと出てきました!
hichon

2018/05/11 23:24

特に問題は無いようですね。「ExecStart = /usr/bin/env python 〜」の部分を「ExecStart = /usr/bin/python 〜」に修正したらどうなりますか?
morutemu

2018/05/11 23:25

もともとそれだったのですが、特に変化はありませんでした。
tachikoma

2018/05/11 23:38

確認してほしいこと1. python -m pip freezeでscheduleが入っていること。2. 端末でpython -iと入力してインタラクティブモードで立ち上げて、import scheduleが通ること。
hichon

2018/05/11 23:45

そうでしたか。pip show scheduleと/usr/bin/python -m pip show scheduleの結果はどうなりますか?
hichon

2018/05/11 23:50

あとは、import sys、print sys.pathでモジュールの検索パスを確認してください。
morutemu

2018/05/11 23:51

pip show scheduleと/usr/bin/python -m pip show scheduleの結果: Usage: pip show [options] <package> ... no such option: -m
morutemu

2018/05/12 00:00

tachikomaさん。1.schedule==0.5.0入ってました。2.Python 2.7.13 (default, Nov 24 2017, 17:33:09) [GCC 6.3.0 20170516] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import scheduleで特にエラーなく通りました。
hichon

2018/05/12 00:01

コマンドが間違っているようです。-mはpythonのオプションです。
morutemu

2018/05/12 00:09

Name: schedule Version: 0.5.0 Summary: Job scheduling for humans. Home-page: https://github.com/dbader/schedule Author: Daniel Bader Author-email: mail@dbader.org License: MIT Location: /home/pi/.local/lib/python2.7/site-packages Requires:
morutemu

2018/05/12 00:09

↑pip show schedule
morutemu

2018/05/12 00:10

Name: schedule Version: 0.5.0 Summary: Job scheduling for humans. Home-page: https://github.com/dbader/schedule Author: Daniel Bader Author-email: mail@dbader.org License: MIT Location: /home/pi/.local/lib/python2.7/site-packages Requires:
morutemu

2018/05/12 00:10

↑/usr/bin/python -m pip show schedule
morutemu

2018/05/12 00:11

>>> import sys >>> print sys.path ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-arm-linux-gnueabihf', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/pi/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/gtk-2.0']
morutemu

2018/05/12 00:12

と出てきました。
guest

回答1

0

ベストアンサー

モジュールがユーザーディレクトリ(/home/pi/.local/lib/python2.7/site-packages)にインストールされているのが原因と思われます。
systemdからサービスを起動した場合、上記のパスはモジュールの検索パスに含まれません。
rootでモジュールをインストールして下さい。

bash

1$ sudo pip install schedule

投稿2018/05/12 00:32

hichon

総合スコア5737

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

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

morutemu

2018/05/12 03:20

ありがとございました! 2週間悩みました。ようやく解決しました!! 本当にありがとうございました!!! 感謝いたします!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問