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

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

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

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

Python

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

Q&A

解決済

2回答

9879閲覧

自作パッケージがimportできない

ruuuu

総合スコア174

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2020/02/05 11:38

編集2020/02/06 01:46

Qiitaの手順に従い、自作パッケージを作成したのですが、他ディレクトリ内で、 from パッケージ名.ファイル名 import メソッド名のようにしたのですが、ファイルを実行すると、
ModuleNotFoundError: No module named メソッド名 のように表示されてしまいます。
pip listの結果はきちんと、「メソッド名」の後に、パスが記載されている形で登録がされていました。
上記のエラーに関しまして、原因がわからない為、ご助言頂けましたら幸いです。
追記です
自ディレクトリは、パッケージを作成したディレクトリ(setup.pyがある場所)であり、「User/Desktop/packege/」などの場所です。(こちらは、Qiita記事内の「Farewell2016」ディレクトリになります。階層としては、一番外側のディレクトリです。)
他ディレクトリは、例えば、「User/Desktop/test/」のような場所です。

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

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

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

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

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

coco_bauer

2020/02/05 12:15

「他ディレクトリ内で」って、ディレクトリの構成はどうなっていて、何を自ディレクトリと呼んでいるのですか?「from パッケージ名.ディレクトリ import メソッド名のようにした」って、これは自作パッケージの話ですか、それとも自作パッケージをインポートしようとしているPythonのプログラムの話?  もっと具体的にファイルやディレクトリの構成、プログラムのコードなどを示してください!
ruuuu

2020/02/05 12:22

情報不足すみません。追記しました。
ruuuu

2020/02/05 12:23

「from パッケージ名.ディレクトリ import メソッド名」こちらは、他ディレクトリ内のファイルにて、記載して内容になります。
quickquip

2020/02/05 23:23 編集

あなたが参考にしたページではなくてあなたかやったこと、確認したことを書いてください。「参考にしたページ」は、あなたの問題を解決する役には立ちません。
ruuuu

2020/02/05 23:25

修正しました
quickquip

2020/02/05 23:42

あなたがなにをやったのかなにを確認したのか(手順のどこまでやってどこで困っているのか)が伝わってません。例えば、ファイル名なども含めてすべて手順の通りにしたのかそうでないのか、たったそれだけのことさえ、この質問からは読み取れません……。
quickquip

2020/02/05 23:45 編集

例えば質問の User/Desktop/packege/ というディレクトリがqiitaの記事の advent2016 にあたるディレクトリなのか、その上のディレクトリなのかさえ伝わりません。想像としては advent2016 を packege という名前にして作業しているのでしょうけれど、そういう「肝心な部分」が想像でしかわからない状態では回答できません。
ruuuu

2020/02/05 23:56

追記しました!
quickquip

2020/02/06 01:14 編集

User/Desktop/packege/ というディレクトリがある User/Desktop/packege/パッケージ名 というディレクトリがある User/Desktop/packege/パッケージ名/ディレクトリ.py というファイルがある (!) User/Desktop/packege/パッケージ名/ディレクトリ.py に メソッド名 という名前のメソッドがある ということになるのですが合ってますか? https://qiita.com/himenoglyph/items/77f2534bc32eaad494dc#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E6%9C%80%E5%B0%8F%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB の構造の通りなら User/Desktop/packege/ ←→ Farewell2016 User/Desktop/packege/パッケージ名 ←→ Farewell2016/Farewell2016 User/Desktop/packege/パッケージ名/ディレクトリ.py ←→ Farewell2016/Farewell2016/Greet.py User/Desktop/packege/パッケージ名/ディレクトリ.py の メソッド名 ←→ Farewell2016/Farewell2016/Greet.py の farewell ですね? 左があなたの構造、右がqiitaのページの構造
ruuuu

2020/02/06 01:31

はい!その通りでございます。質問分かりにくくて、すいません。
ruuuu

2020/02/06 01:33

実を申しまして、githubにはあげているのですが、出来れば、あまり晒したくないと思っているので、敢えて、詳細なコードは書いていないのですよね...
quickquip

2020/02/06 01:47 編集

質問に書いてある"ディレクトリ"がファイル名だとは普通わかりませんよ…… あと、情報は質問に追記してください。(この欄に書いてあることを他の人にも読んでもらえると期待しないでください)
ruuuu

2020/02/06 01:47

確かにそうですね... 修正しておきました。
ruuuu

2020/02/06 03:07

view数に対して、回答がつかないのは、やはりコードがないからでしょうかね...?
quickquip

2020/02/06 03:45

なにをしたのかがわからないからです
katsuko

2020/02/06 11:36

確認しますが、「python setup.py develop」をしましたか?「python setup.py install」ではダメですよ。
ruuuu

2020/02/06 11:58

>python setup.py develop こちら、実行しました。
ruuuu

2020/02/07 00:04

おそらく、pythonを最初にインストールした際に、2がインストールされてしまい、その後3をインストールしたのもあり、色々とおかしくなってしまったのかもしれません....
ruuuu

2020/02/07 09:14

もしかしたら、解決できるかもしれません 少々お待ちください...後ほど、コメント欄に記載いたします
guest

回答2

0

ベストアンサー

python setup.py develop」を実行しているとの事なのでこれが原因ではないと思うのですが、参考にされているサイトがちょっとアレなんで回答しておきます。

サイトの

python

1from setuptools import setup, find_packages 2 3setup( 4 name='Farewell2016', 5 version="0.0.1", 6 description="さよなら2016年", 7 long_description="2016年にお別れを言うだけのパッケージ", 8 author='k.himeno', 9 license='MIT', 10 classifiers=[ 11 "Development Status :: 1 - Planning" 12 ], 13 keywords='farewell' 14)

を「setup.py」としていると思いますが、大きな間違いがあります。
インストールするパッケージを指定する「packages」キーワードが指定されていません。
よって、インストールはできるけど、パッケージは何もない、というパッケージになってしまいます。

以下のようにパッケージを指定すべきです。

python

1from setuptools import setup, find_packages 2 3setup( 4 packages=['Farewell2016'], 5 # 以下、略 6) 7 8# もしくは、 9setup( 10 packages=find_packages(), 11 # 以下、略 12) 13

なお、「python setup.py install」をするとパッケージがない状態なのでインポートできませんが、developだとインポートできます。
これは、developだと、パッケージのインストールは行わず、パッケージのパスがsetup.pyのディレクトリにあるかのごとく設定されて、あたかもインストールされたかのように振る舞うからのようです。
(正直、developコマンドは知らないので、ちらっと調べた限りなので間違っていたらゴメン)
ですので、developを実行したのであれば問題ない(と言っていいかわからないが)ですが、もし何だったらpackagesを指定して試してみてください。

ちなみに、__init__.pyについて。
python2では、__init__.pyのないパッケージはインポートできませんが、python3ではなくてもインポートはできます。
しかし、上記のsetuptools.find_packagesを使った場合、__init__.pyのないパッケージは無視されるようなので、とりあえず__init__.pyは用意しておいた方がよいでしょう。

投稿2020/02/06 13:37

katsuko

総合スコア3469

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

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

ruuuu

2020/02/06 23:57

ご回答ありがとうございます。 「packages」を指定し、再度「pip install」としましたら、以下のようなエラーが表示されました。 「DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support Defaulting to user installation because normal site-packages is not writeable 」 その為、「pip3 install 」 としましたら、今度は以下のようなエラーに切り替わりました。 ERROR: You must give at least one requirement to install (see "pip help install") 以前から気になっていたことではあるのですが、「pip」と「pip3」どちらを使用すれば良いかが分からないといった状況でして... 「pip install」こちらの実行結果から、「python」のバージョンが2なのが問題だとは思うのですが、python3をインストールし、普段からpython3を開発でも使ってはいるんですよね,,,
katsuko

2020/02/07 00:15

出勤前なので軽く。 「pip」はpython2、「pip3」はpython3の環境にインストールします。 pipでのインストールは、(python3であれば)「setup.py」のあるディレクトリで「pip3 install .」(最後に「.」ピリオド)です。
katsuko

2020/02/07 00:49

あー間違い。いや大方間違いでないのだけど、pipコマンドでどのバージョンの環境にインストールされるかは環境によって違うことがあるので、注意してください。
ruuuu

2020/02/07 01:49 編集

ありがとうございます。 「pip3 install .」こちら実行しましたら、「Successfully installed」となり、該当のパッケージファイル(qiita記事内でいう、farewell2016のgreet.pyのfarewell)を別ディレクトリのファイルにimportし、ファイルを実行しましたら、「ModuleNotFoundError: No module named メソッド名」ではなく、「SyntaxError: invalid syntax」に変わりました。
ruuuu

2020/02/07 02:28

勘違いでした.... 別ディレクトリにて、読み込んだファイルを実行する際、「python test.py」のような形で実行しており、「python3 test.py」といった形に実行しましたら、「ModuleNotFoundError: No module named」と表示されてしまいました
ruuuu

2020/02/08 10:03

解決が出来ましたので、ご報告させて頂きます。 実は、自作パッケージの名前が重複しており、直接の原因がそこにあったと推測しております。 さらには「packages=['Farewell2016'],」こちらのように、パッケージ名を追記し、「pip3 install . 」としましたら、無事に読み込むことが出来ました。 ご親切、ご丁寧にご回答頂きましてありがとうございました。 色々と教えて頂きましたおかげで、無事に、解決できました。
guest

0

shell

1pip -V

を実行する。

plain

1(どこか)/site-packages/pip

がででくるはずなので(どこか)/site-packages/のディレクトリを見る。

site-packagesには

  1. (Python上のパッケージ名) のディレクトリがある
  2. (Python上のパッケージ名)/(Python上のモジュール名).py のファイルがある
  3. (Python上のパッケージ名)/(Python上のモジュール名)/(質問でいうメソッド名)/というディレクトリ や (Python上のパッケージ名)/(Python上のモジュール名)/(質問でいうメソッド名).py というファイルがない
  4. (pip listしてでてくる名前)-(バージョン)py3-py3.(Pythonのマイナーバージョン).egg-info というファイルがある(かもしれないし、ないかもしれない)

という状態が正しいと思うので確認してはどうでしょうか。

「Python上のパッケージ名」と「pip上のパッケージ名」は別の概念なので注意してください。後者を(pip listしてでてくる名前)と書きました。


それが確認できたら

python -c 'import パッケージ名; print(パッケージ名.__path__) python -c 'import パッケージ名; print(パッケージ名.ファイル名.__file__)

が上の 1. や 2. を指すか確認します。このパッケージ名はPython上のパッケージ名です。
__path__の確認はqiitaにも書いてある話です。


それが確認できたら、2. のファイルの中身が「自分が思っているもの」と一致するか確認する。
この場合、メソッド名(と質問に書いてあるところの関数名)が存在するか確認します。


(とここまで書いて気づきましたがqiitaのこの記事、__init__.pyを作ってないですね。よい作法ではないですが、それが原因かどうかはわかりません)

投稿2020/02/06 03:45

quickquip

総合スコア11038

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

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

ruuuu

2020/02/06 04:15 編集

ご回答ありがとうございます。 自分自身、質問しておきながら、あまりにも情報が少なかったこと、反省しなければならないと思っております。 「pip -V」こちらの結果なのですが、以下のように表示されました。 「/Library/Python/2.7/site-packages/pip (python 2.7) 自分は、「Python2.7」を使うつもりはなかったのですが、何故か「2.7」との表示がされました... しかし,「pip3 -V」としましたら、以下のように表示されました。 「/usr/local/lib/python3.7/site-packages/pip (python 3.7)」 その為、念の為、「sudo pip3 install develop」こちらのように、再度pipによるinstallを行いました。 これは、「pip - V」と実行して表示されたディレクトリと、「pip3 -V」として実行した際のディレクトリ、どちらの確認をすれば良いと思われますでしょうか...?
ruuuu

2020/02/06 04:22 編集

また、パッケージに関して、例えばなのですが、dropboxにフォルダをアップロードいたしますので、そちらから、少々チェック頂くといったことは可能でしょうか...?
quickquip

2020/02/06 04:32 編集

Python3にインストールしていたつもりがPython2に入っていた、で原因がわかって解決ではないのですか?
ruuuu

2020/02/06 04:56 編集

いえ...現状、未だ、testディレクトリ内のファイル実行結果は、「ModuleNotFoundError: No module named メソッド名 」となってしまっています...
quickquip

2020/02/06 05:20

エラーメッセージから察するに、pythonも2を動かしているのでは? という気がしてきました。 python も -V オプションでバージョンが調べられるので確認してみては。 実はmacOS?
ruuuu

2020/02/06 05:55

「python -V」 こちらの結果、「Python 2.7.16」でした。 OSは「macOS」です。 pythonのバージョンに関しまして、何故か2系になっておりました...
ruuuu

2020/02/06 05:59 編集

実は、毎回「source ~/.bash_profile」を実行しますと、python2からpython3に変更になるのですが、こちらのコマンドがエラーとなってしまっていて、実行できないといった状況でして... 放置していたんですよね...
ruuuu

2020/02/06 06:00

エラー内容は本質問とは、直接関係がない為、一旦別質問を建てたいと思います。
ruuuu

2020/02/06 08:36

「 https://teratail.com/questions/239795 」こちらにて、別途質問を立てさせて頂きました。 もし、お時間ありましたら、少々チェック頂きましたら幸いです。
quickquip

2020/02/06 09:14

なぜpip3をsudoで動かしたのか気になります。sudo pip3 -V の結果はどうなりますか?
ruuuu

2020/02/06 10:01

「sudo pip3 -V」こちらの結果は以下となりました。 pip 19.3.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
quickquip

2020/02/06 10:09

ならあなたが実行したいPythonは /usr/local/bin/python3 ですね あとは確認すればいいかと
ruuuu

2020/02/06 12:15 編集

「 /usr/local/lib/python3.7/site-packages/」 こちらを確認してみたのですが、「(Python上のパッケージ名) 」が存在していませんでした... (Qiitaのリンク先記事のディレクトリに置き換えますと、「Farewell2016」になります)
ruuuu

2020/02/08 10:02

解決が出来ましたので、ご報告させて頂きます。 実は、自作パッケージの名前が重複しており、直接の原因がそこにあったと推測しております。 さらには、katsukoさんにご回答いただきました「packages=['Farewell2016'],」こちらのように、パッケージ名を追記し、「pip3 install . 」としましたら、無事に読み込むことが出来ました。 ご親切、ご丁寧にご回答頂きましてありがとうございました。 色々と教えて頂きましたおかげで、無事に、解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問