web-dev-qa-db-ja.com

Python 'No module named' error; 'package' is not a package

簡単なインポートを作成し、emailageサードパーティライブラリを使用しようとしています。

彼らのドキュメントによると、彼らのライブラリを使用する方法は次のとおりです:

pip install emailage-official

次に、単に次のようにインポートします。

from emailage.client import EmailageClient

インストールはpipで正常に機能します-エラーはありません。 emailageパッケージが適切なディレクトリ内に存在することを確認するためにダブルチェックしました。

パッケージは次の場所にあります:

C:\Users\aaron\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\emailage

このフォルダーには(一見)__init__.pyを含む正しいファイルとすべてが含まれています。ただし、pylintとコマンドラインインタープリターのどちらからも「emailage.clientという名前のモジュールはありません」と表示されます。 「emailage」はパッケージではありません」エラー。

私のsys.pathの出力は次のとおりです。

[... 
'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages'
...
]

したがって、emailageがインストールされているディレクトリはパスの一部です...そして最後に、正しく動作するかどうかをテストするために、numpyをpipインストールしました。 Numpyはemailageと同じsite-packagesフォルダーにインストールされており、インポートすると正常に動作するので、行き詰まっています。

私は通常、Python=をあまり使用しません。そのため、どんな助けもいただければ幸いです。

4
Aaron Taveras

問題はファイルの名前にありました。

私は急いで自分のファイルに名前を付けましたemailage.pyからインポートし、emailage.client

Pythonは現在のディレクトリを調べ、インストールされているサードパーティのライブラリを確認する前に作業していたファイルの名前と一致していると想定しています。

ファイルの名前を変更した後、すべてが問題ないようです。

同様の問題に遭遇する他の人のために競合する命名に注意してください。時々、最も単純なものが最も長くつまずきます。

7
Aaron Taveras

私は似たようなものに遭遇し、名前空間の衝突に関するOPからの回答が、最終的に私を突き止めました。

サブパッケージ(ディレクトリ)とその中のモジュール(ファイル)の両方に同じ名前を使用していました。

たとえば、私はこれを持っていました:

/opt/mylib/myapi
/opt/mylib/myapi/__init__.py
/opt/mylib/myapi/myapi_creds.py        # gitignored file for user/pass
/opt/mylib/myapi/myapi.py              # base module, load creds and connect
/opt/mylib/myapi/myapi_dostuff.py      # call myapi.py and do work

スクリプト 'myapi.py'は、次のステートメントを使用してmyapi_creds.pyから認証情報をインポートします。

from myapi.myapi_creds import my_user, my_pass

モジュール「myapi.py」をテストすると、次のエラーが発生しました。

$ ./myapi.py
Traceback (most recent call last):
  File "./myapi.py", line 12, in <module>
    from myapi.myapi_creds import my_user, my_pass
  File "/opt/mylib/myapi/myapi.py", line 12, in <module>
    from myapi.myapi_creds import my_user, my_pass
ModuleNotFoundError: No module named 'myapi.myapi_creds'; 'myapi' is not a package

解決策は、myapi.pymyapi_base.pyに名前変更して、その名前がサブパッケージ名と衝突しないようにすることでした。

3
ahxn81

この問題を確認しましたが、発生したエラーとまったく同じではありませんが、問題の解決に役立ちました。一部のユーザーが便利だと思うので、状況を説明します。だから、私は次のエラーログを取得していました:

    Traceback (most recent call last):
  File "/home/kemal/Programming/Python/Preference_Articulation/LocalSearch/LS_apriori.py", line 1, in <module>
    from LocalSearch.LocalSearch import LocalSearch
ModuleNotFoundError: No module named 'LocalSearch.LocalSearch'; 'LocalSearch' is not a package

私のプロジェクトの構造は次のとおりです(PyCharmを使用): プロジェクト構造のビュー

読みやすくするために、コードをいくつかのフォルダーに分けたことに注意してください。今、LocalSearchという名前のフォルダに、4つのファイルがありますLocalSearch、LS_aprioriおよびいくつかの2つのテストファイル(関連なし)。ファイルLS_apriori(ファイルとLocalSearchのメソッドとクラスを使用)を実行しようとすると、上記のエラーが発生しました。コードは特に重要ではなく、インポートの処理方法は次のとおりです。

from LocalSearch.LocalSearch import LocalSearch

修正は簡単でした。 py-fileLocalSearchの名前をLocal_Searchに変更しました(アンダースコアを追加しただけです) )。その後、エラーはなくなりました。

だから私の問題は、その中にファイル(モジュール)と同じ名前のフォルダ(パッケージ)があり、その中に同じ名前のクラスがあることでした。 Python気に入らなかった。パッケージと同じ名前のモジュールを内部に持つことは問題ないが、クラスがさらに混乱を加えただけだと思う​​。

0
Kemica