ラズベリーパイでpythonプログラムを自動実行する際、仮想環境に入っていないpythonファイルは、sudo nano /etc/rc.localに書き込むだけでよいのですが、仮想環境(pipenv)が入っていると、上手くいかず、色々試しましたが、シェルという拡張子が[.sh]のファイルを作り、そのファイルを自動実行させる方法が一番良かったのでご紹介したいと思います。
① 自動実行用のシェルを作成
まず、ファイルを作成します。ファイルは、後で移動させますので、どこで作成しても良いですが、ターミナルを使って移動させますので、「 /home/pi/ 」に作成すると良いです。「ファイル名」+「.sh」という名前で作成。
例)autostartPY.sh
そして、そのファイルの中に、下記のようなコードを記述します。
#! /bin/sh
cd /home/pi/ble_pybleno/
sudo pipenv run python3 servo.py
- 1行目はそのまま記述して下さい。
- 2行目はフォルダの移動を意味していますので、自身の実行したいpipenv下のフォルダを「cd」の後に記述して下さい。
- 3行目は実行したいpythonファイルを「sudo pipenv run python3」の後に記述して下さい。
これで、自動実行用のシェルは準備できました。
② シェルを/usr/local/bin/に移動する
次に、先ほど作成した拡張子「.sh」のファイルを指定場所に移動させます。管理者権限が必要となりますので、ターミナルから実行します。
sudo mv ./autostartPY.sh /usr/local/bin/
「 /usr/local/bin/ 」に移動していたら成功です。
③ /etc/rc.localにシェルを実行するように指定
OS起動時に実行したい処理を記述するために「 /etc/rc.local 」に、先ほど作成したシェルを指定します。ターミナルから実行します。
sudo nano /etc/rc.local
一番下の行に、「 exit 0 」とありますが、それよりも上に自動起動したい処理を指定します。(記述後は、ファイル保存をお忘れなく。)
......(略)
sleep 15
autostartPY.sh
exit 0
「sleep 15」は、OS起動15秒後に「autostartPY.sh」の処理を実行することを意味します。15秒待機は念の為入れています。以前に、JavaScriptのファイルを自動起動させようとした時、「 sleep 」がないと動かないことがあった為です。15秒は決まりではないので、もっと短くしても良いと思います。
④ シェルファイルのアクセス権を変更
おそらくこのまま、ラズベリーパイを再起動しても、自動起動が上手くいかないと思います。そこで、シェルファイルの実行権限を変更します。ターミナルから実行します。
chmod +x autostartPY.sh
これで完成です。
この記事の内容の通りに操作を行った場合、ラズベリーパイを再起動すると、仮想環境(pipenv)下「 /home/pi/ble_pybleno/ 」フォルダ内の「 servo.py 」が自動起動します。
まとめ
いかがたったでしょうか。仮想環境下にあるpythonファイルは、仮想環境のパスを指定しても、簡単には自動実行できなかったためシェルを使った方法をご紹介しました。
上記以外に、OS起動後ターミナルを自動で起動し、そこから自動で仮想環境下のpythonファイルを実行する方法があります。ただし、ターミナルを開いてからpythonファイルを実行する方法では、モニターを繋げていないと、自動実行できないというデメリットがあったため、シェルのみ実行する方法を今回記事にさせて頂きました。