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

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

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

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

Python

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

Q&A

解決済

1回答

615閲覧

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

chekke1999

総合スコア21

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/09/12 17:17

編集2022/09/28 09:15

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+

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

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

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

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

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

quickquip

2022/09/12 23:56

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

2022/09/13 16:11

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

回答1

0

ベストアンサー

setup.cfgは書いたことがないのですが、大体setupの引数と同じだと思ってますので、そのつもりで回答します。

setup.cfgscripts は、実行可能なディレクトリにシェルスクリプトとしてスクリプトをコピーする指定、console_scripts は、実行可能なディレクトリに指定したモジュールと関数を実行する実行可能ファイルを作成する指定なので、やっていることは違いますが目的としては同じものです。

また、エラーメッセージを読む限りでは、scripts で指定したファイルを elodie モジュールとして読み込んでしまってます。
そのために elodie.dependenciies モジュールが見つからないのではないでしょうか。

なので、

  1. setup.cfg の「scripts = elodie.py」は削除
  2. elodie.py は、elodie ディレクトリに移動(いっしょにインストールされるようにするため)
  3. set.cfgの「console_scripts」は、「elodie = elodie.elodie:entrypoint」に変更(2.でファイルを移動したため)

とすればいい気がします。


setup.py

python

1# coding: utf-8 2 3from setuptools import setup 4 5setup() 6

setup.cfg

[metadata] name = elodie [options] packages = find: [options.entry_points] console_scripts = elodie = elodie.elodie:entrypoint

elodie/elodie.py

python

1# coding: utf-8 2 3def entrypoint(): 4 print('Hello, world!') 5

elodie/__init__.py

python

1# 空でもいいので、__init__.pyがないとパッケージとして見つけてくれない。

上記の構成でsetupしてみましたが、ちゃんとelodieを実行して「Hello, world!」が表示されました。

コメントでも書きましたが、とりあえず「pip3 show -f elodie」を実行して、ちゃんとインストールされたものを確認してください。
もしパッケージがインストールされていないのであれば、考えられるとしたら、

  • setup.cfgpackages の項目を削除してしまった。
  • elodie/__init__.py がない。(フォルダの中に「__init__.py」がないと、パッケージとして見つけてくれません)

ぐらいですかね。

投稿2022/09/14 00:02

編集2022/09/16 11:46
katsuko

総合スコア3462

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

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

chekke1999

2022/09/15 15:26 編集

教えて頂いた手順の後にpip3 install ./したあとにelodieを実行すると以下のようなエラーが出ます。 Traceback (most recent call last): File "/home/username/.local/bin//elodie", line 5, in <module> from elodie.elodie import entrypoint ModuleNotFoundError: No module named 'elodie' おそらく~/.local/lib/python3.10/site-packagesに/home/username/.local/bin/elodieがimportするであろうパッケージが設置されてるはずだと思いますが、~/.local/lib/python3.10/site-packages/elodie-0.0.0.dist-infoしかありません...。
katsuko

2022/09/16 00:06

もしかして、前にインストールした$HOME/.local/bin/elodie.pyが残っていませんか?(.pyがついている点に注意) あれば、削除してください。
katsuko

2022/09/16 00:08

あと、「pip3 show -f elodie」でインストールしたファイルの内容を確認してください。
chekke1999

2022/09/27 14:25

とりあえずコンテナ検証用のdockerコンテナ作り直してpythonのバージョンを3.9に下げたらちゃんと出来ました。ありがとうございます。pythonのバージョンが3.10以降だとだと以下のエラーが出てダメでした。 Traceback (most recent call last): File "/home/username/.local/bin//elodie", line 5, in <module> from elodie.elodie import entrypoint File "/home/username/.local/lib/python3.10/site-packages/elodie/elodie.py", line 32, in <module> from elodie.result import Result File "/home/username/.local/lib/python3.10/site-packages/elodie/result.py", line 1, in <module> from tabulate import tabulate File "/home/username/.local/lib/python3.10/site-packages/tabulate.py", line 7, in <module> from collections import namedtuple, Iterable ImportError: cannot import name 'Iterable' from 'collections' (/usr/local/lib/python3.10/collections/__init__.py)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問