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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

解決済

setup.cfgとsetup.pyでpip3 installしたプログラムが動作しない

chekke1999
chekke1999

総合スコア21

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1回答

0リアクション

0クリップ

268閲覧

投稿2022/09/12 17:17

編集2022/09/13 16:09

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

FROM python:3.10.5-alpine3.16 ARG USER_NAME ARG UID ARG GID ENV PATH $PATH:/home/${USER_NAME}/.local/bin/ RUN mkdir /home/${USER_NAME} && chown ${UID}:${GID} /home/${USER_NAME} RUN apk update --no-cache RUN apk add --no-cache --virtual py-set python3-dev gcc libc-dev RUN apk add --no-cache --virtual Pillow-lib zlib-dev jpeg-dev gcc musl-dev RUN apk add --no-cache perl-image-exiftool exiftool RUN pip3 install click send2trash future requests six tabulate

yml

version: '3' services: elodie: build: context: . dockerfile: Dockerfile.new args: - USER_NAME=${USER_NAME} - UID=${UID} - GID=${GID} user: ${UID}:${GID} container_name: elodie working_dir: /home/${USER_NAME}/elodie volumes: - /etc/group:/etc/group:ro - /etc/passwd:/etc/passwd:ro - ./:/home/${USER_NAME}/elodie tty: true

入ったら/home/${USER_NAME}/elodieがカレントディレクトリでそこに上記のプロジェクトフォルダがマウントされてます。
まずは./elodie.pyでそのまま実行してみます。以下のような出力が表示されます。

txt

Usage: elodie.py [OPTIONS] COMMAND [ARGS]... Options: --help Show this message and exit. Commands: batch Run batch() for all plugins. generate-db Regenerate the hash.json database which contains all of... import Import files or directories by reading their EXIF and... update Update a file's EXIF. verify

次にpip3 install -v ./でインストールします。/home/$HOME/.local/bin/elodieにインストールされパスが通った状態になるのでelodieと入力し実行します。すると下記のようなエラーを出力します。

txt

Traceback (most recent call last): File "/home/username/.local/bin//elodie", line 5, in <module> from elodie import entrypoint File "/home/username/.local/bin/elodie.py", line 14, in <module> from elodie.dependencies import verify_dependencies ModuleNotFoundError: No module named 'elodie.dependencies'; 'elodie' is not a package

elodieフォルダ配下のプログラムが一緒にインストールされなかったからだと思います。

作成したsetup.cfgとsetup.py

python

#!/usr/bin/env python3 from setuptools import setup from pathlib import Path from os import path,sep import shutil # home directory配下の.elodieに設定ファイルを設置 from_config = Path(f"{path.dirname(path.abspath(__file__))}{sep}config.ini-sample") to_config = Path(f"{path.expanduser('~')}{sep}.elodie{sep}config.ini") def copy(from_p,to_p): print(f"copy configfile") print(f"{from_p} > {to_p}\n") to_p.parent.mkdir(parents=True,exist_ok=True) if not to_p.is_file(): shutil.copy(from_p,to_p) copy(from_config,to_config) setup()

cfg

[metadata] name = elodie description = メディアファイル整理プログラム long_description = file: README.md long_description_content_type = text/markdown license = GNU GENERAL PUBLIC LICENSE license_file = LICENSE [options] scripts = elodie.py install_requires = click==6.6 requests==2.20.0 Send2Trash==1.3.0 future==0.16.0 configparser==3.5.0 tabulate==0.7.7 Pillow==6.2.2; python_version == '2.7' Pillow==8.0; python_version >= '3.6' six==1.9 packages = find: [options.entry_points] console_scripts = elodie = elodie:entrypoint

elodie.pyは下記のように少し手を加えています

diff

diff --git a/elodie.py b/elodie.py index 5eb2097..9ffdf12 100755 --- a/elodie.py +++ b/elodie.py @@ -367,8 +367,7 @@ main.add_command(_generate_db) main.add_command(_verify) main.add_command(_batch) - -if __name__ == '__main__': +def entrypoint(): #Initialize ExifTool Subprocess exiftool_addedargs = [ u'-config', @@ -376,3 +375,7 @@ if __name__ == '__main__': ] with ExifTool(executable_=get_exiftool(), addedargs=exiftool_addedargs) as et: main() + +if __name__ == '__main__': + entrypoint() +

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

quickquip

2022/09/12 23:56

動作しない とはどういうことですか? import ができないということか、importがエラーになるということか、挙動が異なってしまうということか、あたりを想像しますが、実際はどうなりますか プロジェクトのルート直下にソースコードをおいてる場合 とはどういうことですか。プロジェクトをどういう意味で使っていますか? どういう構造をしていますか? どのように実行していますか? あたりを質問を編集して追記するとよいと思います。
chekke1999

2022/09/13 16:11

>importがエラーになるということか、挙動が異なってしまうということか、あたりを想像しますが、実際はどうなりますか おっしゃる通りです。質問内容を編集しました。ご確認頂ければと思います。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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