setup.cfgとsetup.pyでpip3 installしたプログラムが動作しない。プロジェクトフォルダ上で直接実行すると動きます。おそらくsetup.cfgの書き方が間違っているのですが、setuptoolsを読んでみてもいまいち正しい書き方がわかりません。参考になりそうな記事もソースコードがプロジェクトのルート(setup.pyとsetup.cfgが置かれているディレクトリを指します)ではなく配下にsrcフォルダ等作ってそちらにソースコードをすべて入れているような記述でプロジェクトのルート直下にソースコードをおいてる場合どうすればいいのかがわかりません。
実現したいこと
elodieというpythonで書かれたプログラムをpip3 install ./
にて依存関係もまとめてインストールしパスを通った状態にして実行できるようにしたいです。
- プロジェクトフォルダ内で
pip3 install ./
したら依存関係をまとめてインストールする。 -
$HOME/.local/bin/
にインストールされ、コマンドとしてパスが通ってる状態にする。
実行環境とやったこと
プロジェクトフォルダの中身
下記リンクを参照してください。
https://github.com/chekke1999/elodie/tree/teratail-qa-branch
下記のdockerfileとdocker-composeの内容で作ったコンテナにdocker exec -it elodie ash
で入ります。
Dockerfile
1FROM python:3.10.5-alpine3.16 2ARG USER_NAME 3ARG UID 4ARG GID 5ENV PATH $PATH:/home/${USER_NAME}/.local/bin/ 6RUN mkdir /home/${USER_NAME} && chown ${UID}:${GID} /home/${USER_NAME} 7RUN apk update --no-cache 8RUN apk add --no-cache --virtual py-set python3-dev gcc libc-dev 9RUN apk add --no-cache --virtual Pillow-lib zlib-dev jpeg-dev gcc musl-dev 10RUN apk add --no-cache perl-image-exiftool exiftool 11RUN pip3 install click send2trash future requests six tabulate
yml
1version: '3' 2services: 3 elodie: 4 build: 5 context: . 6 dockerfile: Dockerfile.new 7 args: 8 - USER_NAME=${USER_NAME} 9 - UID=${UID} 10 - GID=${GID} 11 user: ${UID}:${GID} 12 container_name: elodie 13 working_dir: /home/${USER_NAME}/elodie 14 volumes: 15 - /etc/group:/etc/group:ro 16 - /etc/passwd:/etc/passwd:ro 17 - ./:/home/${USER_NAME}/elodie 18 tty: true
入ったら/home/${USER_NAME}/elodie
がカレントディレクトリでそこに上記のプロジェクトフォルダがマウントされてます。
まずは./elodie.py
でそのまま実行してみます。以下のような出力が表示されます。
txt
1Usage: elodie.py [OPTIONS] COMMAND [ARGS]... 2 3Options: 4 --help Show this message and exit. 5 6Commands: 7 batch Run batch() for all plugins. 8 generate-db Regenerate the hash.json database which contains all of... 9 import Import files or directories by reading their EXIF and... 10 update Update a file's EXIF. 11 verify
次にpip3 install -v ./
でインストールします。/home/$HOME/.local/bin/elodie
にインストールされパスが通った状態になるのでelodie
と入力し実行します。すると下記のようなエラーを出力します。
txt
1Traceback (most recent call last): 2 File "/home/username/.local/bin//elodie", line 5, in <module> 3 from elodie import entrypoint 4 File "/home/username/.local/bin/elodie.py", line 14, in <module> 5 from elodie.dependencies import verify_dependencies 6ModuleNotFoundError: No module named 'elodie.dependencies'; 'elodie' is not a package
elodieフォルダ配下のプログラムが一緒にインストールされなかったからだと思います。
作成したsetup.cfgとsetup.py
python
1#!/usr/bin/env python3 2from setuptools import setup 3from pathlib import Path 4from os import path,sep 5import shutil 6# home directory配下の.elodieに設定ファイルを設置 7from_config = Path(f"{path.dirname(path.abspath(__file__))}{sep}config.ini-sample") 8to_config = Path(f"{path.expanduser('~')}{sep}.elodie{sep}config.ini") 9def copy(from_p,to_p): 10 print(f"copy configfile") 11 print(f"{from_p} > {to_p}\n") 12 to_p.parent.mkdir(parents=True,exist_ok=True) 13 if not to_p.is_file(): 14 shutil.copy(from_p,to_p) 15copy(from_config,to_config) 16setup()
cfg
1[metadata] 2name = elodie 3description = メディアファイル整理プログラム 4long_description = file: README.md 5long_description_content_type = text/markdown 6license = GNU GENERAL PUBLIC LICENSE 7license_file = LICENSE 8[options] 9scripts = 10 elodie.py 11install_requires = 12 click==6.6 13 requests==2.20.0 14 Send2Trash==1.3.0 15 future==0.16.0 16 configparser==3.5.0 17 tabulate==0.7.7 18 Pillow==6.2.2; python_version == '2.7' 19 Pillow==8.0; python_version >= '3.6' 20 six==1.9 21packages = find: 22 23[options.entry_points] 24console_scripts = 25 elodie = elodie:entrypoint 26 27
elodie.pyは下記のように少し手を加えています
diff
1diff --git a/elodie.py b/elodie.py 2index 5eb2097..9ffdf12 100755 3--- a/elodie.py 4+++ b/elodie.py 5@@ -367,8 +367,7 @@ main.add_command(_generate_db) 6 main.add_command(_verify) 7 main.add_command(_batch) 8 9- 10-if __name__ == '__main__': 11+def entrypoint(): 12 #Initialize ExifTool Subprocess 13 exiftool_addedargs = [ 14 u'-config', 15@@ -376,3 +375,7 @@ if __name__ == '__main__': 16 ] 17 with ExifTool(executable_=get_exiftool(), addedargs=exiftool_addedargs) as et: 18 main() 19+ 20+if __name__ == '__main__': 21+ entrypoint() 22+

回答1件
あなたの回答
tips
プレビュー