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

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

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

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Raspberry Pi

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

Python

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

Q&A

0回答

1108閲覧

service実行時のpythonプログラムでモジュールの読み込みができない

aiai8976

総合スコア112

systemd

systemdは、Linuxの起動処理及びシステム管理を行う技術です。他にも多くのサービス管理機能を備えており、ユーザープロセスを並列に起動しシステムの起動処理に要する時間を短縮できるなどの特徴があります。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2020/11/12 23:55

編集2020/11/13 01:49

前提・実現したいこと

serviceを使って自動起動プログラムを作成しています。
serviceで対象ディレクトリのシェルスクリプトを実行したいのですが、うまく行きません。
具体的にはpythonプログラムの実行が原因で以下のようなエラーが発生しています。(echoにしたところinactiveになった)
serviceでpythonプログラムを実行したければどのように指定すればいいのでしょうか。
いろいろ探ってみると、同じ階層上のprintのみするpythonプログラムは実行できました。
しかし、sample.pyで読み込んでいるpytzや自作モジュールを読み込もうとするとエラーになりました。
わかる方がいましたら、回答お願いします。

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

sample.service - sample daemon Loaded: loaded (/etc/systemd/system/sample.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2020-11-12 16:15:43 JST; 12s ago Process: 2848 ExecStart=/home/pi/shellscript/sample.sh (code=exited, status=1/FAILURE) Main PID: 2848 (code=exited, status=2) 11月 12 16:15:43 uname systemd[1]: Started sample daemon. 11月 12 16:15:43 uname systemd[1]: sample.service: Main process exited, code=exited, status=1/FAILURE 11月 12 16:15:43 uname systemd[1]: sample.service: Failed with result 'exit-code'.

該当のソースコード

#!/bin/bash python3 /home/pi/sample.py 2>> log.txt
[Unit] Description = daemon [Service] ExecStart = /home/pi/shellscript/sample.sh Restart = no Type = simple [Install] WantedBy = multi-user.target

試したこと

サービスを使わずにシェルスクリプトを直接実行するとsample.pyはうまく動作します。

python

1# sample.py 実際に使いたいプログラム 2 3from datetime import datetime 4from pytz import timezone 5import time 6import schedule 7import subprocess 8import os 9import log 10 11...

一つ一つ試してみると、エラーになるものエラーにならないものがありました。

python

1# hoge.py 2 3from datetime import datetime #○ 4from pytz import timezone 5import time #○ 6import schedule 7import subprocess #○ 8import os #○ 9import log #× 自作モジュール 10 11print('hoge') #これのみだとうまくいく

pytzを読み込もうとしたときのlog.txt
直接python3 hoge.pyを実行するとうまく行きます。

Traceback (most recent call last): File "hoge.py", line 3, in <module> from pytz import timezone ModuleNotFoundError: No module named 'pytz' Traceback (most recent call last): File "hoge.py", line 3, in <module> from pytz import timezone ModuleNotFoundError: No module named 'pytz'
$ /home/pi/berryconda3/bin/python3 -mpip list Package Version ------------------- --------- ... pytz 2020.4 ...

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

OS:Raspberry pi OS

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

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

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

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

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

Daregada

2020/11/13 01:05

python3もsample.pyもlog.txtもすべてフルパスで指定すると、どういう結果になりますか?
aiai8976

2020/11/13 01:26

今自分でいくつか試していて、pythonプログラムは絶対パスで動くことを確認できました。 原因はそこではなく、pythonプログラムのモジュール等を読み込む際に起きているみたいでした。 追加しましたので、確認お願いします。
otn

2020/11/13 01:35 編集

log.txtの内容が提示されてませんが? 複数Python環境があって、モジュールをインストールした環境と、実行している環境が違うというのがありがちです。
aiai8976

2020/11/13 01:39

追記しました。 仮想環境を使わずにグローバルで行っているのですが、serviceはグローバルに対応していないのでしょうか。
otn

2020/11/13 01:46

「グローバル」とは何のことを言ってますか?/usr/bin/python3 のことでしょうか? このシェルスクリプトで/usr/bin/python3を動かしているなら、 /usr/bin/python3 -mpip list で該当モジュールが表示されますか?
aiai8976

2020/11/13 01:49

そうです。 追記しました。 pytzが入っていることは確認できました。
otn

2020/11/13 01:52

再度書きますが、 /usr/bin/python3 -mpip list で該当モジュールが表示されますか?
otn

2020/11/13 01:58 編集

あるいは、 python3 /home/pi/sample.py 2>> log.txt は嘘で、実際は、 /home/pi/berryconda3/bin/python3 /home/pi/sample.py 2>> log.txt と書いている?? 何故 /home/pi/berryconda3/bin/python3 -mpip list を実行したのか理解できないのですが?
aiai8976

2020/11/13 01:57

/usr/bin/python3 -mpip listでpytzは表示されませんでした。 python3 /home/pi/sample.py 2>> log.txtはそのまま書いていて、which python3のpathが/home/pi/berryconda3/bin/python3になっています。 これはどういうことでしょうか。
aiai8976

2020/11/13 01:59

自分のpython3のpathが/home/pi/berryconda3/bin/python3だったので、そうしました。
otn

2020/11/13 02:01

> /usr/bin/python3 -mpip listでpytzは表示されませんでした。 は、 > 複数Python環境があって、モジュールをインストールした環境と、実行している環境が違うというのがありがちです。 ということです。 /usr/bin/python3 の環境にモジュールをインストールしましょう。 > which python3のpathが/home/pi/berryconda3/bin/python3になっています。 whichはユーザーログインしたシェルプロンプトで実行したのでは? which はserviceのシェルスクリプト内で実行しないと意味無いです。
aiai8976

2020/11/13 02:14

shellscriptのpython3を/home/pi/berryconda3/bin/python3に直したところ、通ったので状況を理解しました。 ありがとうございました。
otn

2020/11/13 02:26

> shellscriptのpython3を/home/pi/berryconda3/bin/python3に直したところ、 全くの個人的利用のシステムであれば、サービスの中で個人ホームディレクトリの中を参照することもありだと思います。「本番稼働」の概念のあるシステムだと駄目ですが。 アドバイスをちゃんと見ましょうね。 > Daregada 2020/11/13 10:05 > python3もsample.pyもlog.txtもすべてフルパスで指定すると、どういう結果になりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問