目的
自作したpythonファイルを以下のようにコマンドラインツールとして実行できるようにする。
以下は成果物のイメージ(画像を回転させるプログラム。ffmpegを使えば...)
user:~$ rotate.py
start rotate...
...
user:~$ cd HOGE
user:~/HOGE$ rotate.py
start rotate...
...
環境
- Ubuntu 20.04 LTS
- python 3.8
pythonを実行できるようにする
プログラムを作成する(詳細は省略)
# import cv2 # とりあえずコメントアウト
print("start rotate...")
実行可能にする
shebang(シバン)を追加する
+ #!/usr/bin/python3
chmod +x rotate.py
参考:
PATHを通す
ファイルがあるディレクトリをPATHに追加する。
今回は ~/.local/bin
というディレクトリにrotate.py
をコピーして、そこにPATHを通す。
# 実行ファイルのコピー
user:~$ mkdir ~/.local/bin
user:~$ cp rotate.py ~/.local/bin
# PATHを通す
user:~$ export PATH=~/.local/bin:$PATH
# 毎回通すのが面倒臭い場合は以下
user:~$ echo "export PATH=~/.local/bin:$PATH" >> ~/.bashrc
user:~$ source ~/.bashrc
参考:
実行確認
以下のようにいろんな場所で実行できるようになればOK。
user:~$ rotate.py
start rotate...
...
user:~$ cd HOGE
user:~/HOGE$ rotate.py
start rotate...
...
仮想環境毎の実行ファイルをコマンドラインで使えるようにする。
問題
実際には python を使う場合は venv
やanaconda
等を使用して、それぞれ独立した仮想環境上で実行することが多い。それらの実行ファイルを前述した方法でコマンドラインで用いることはできない。
例えばrotate.py
でコメントアウトしていたところを修正する。
- # import cv2 # とりあえずコメントアウト
+ import cv2 # とりあえずコメントアウト
そして実行するとエラーが発生する。これは素のpythonにopencvがインストールされていないからである。
user:~$ rotate.py
Traceback (most recent call last):
File "/home/user/.local/bin/rotate.py", line 2, in <module>
import cv2
ModuleNotFoundError: No module named 'cv2'
対策
上述の問題はそれぞれの仮想環境の python を用いることで対処できる。
とりあえず、opencv がインストールされた仮想環境を作成する。
cd ~
user:~$ mkdir imgtools
user:~$ cd imgtools
user:~/imgtools$ python -m venv .venv
user:~/imgtools$ source .venv/bin/activate
user:~/imgtools$ pip install opencv-python
インストールが終わったら、rotate.pyのshebangを以下のように仮想環境の python の PATH に変更する。
- #!/usr/bin/python3
+ #!/home/user/imgtools/.venv/bin/python
そして実行する。すると import cv2
が問題なくインストールできているためエラーを吐かずに実行することができる。
user:~$ rotate.py
start rotate...
...
その他の仮想環境
anaconda
などの場合でも、以下のように shebang を編集することで、それぞれの仮想環境のライブラリをimport することができるようになる。
- #!/usr/bin/python3
+ #!/opt/conda/envs/imgenv/bin/python