web-dev-qa-db-ja.com

__init__.pyが同じディレクトリでモジュールを見つけられない

pythonパッケージでソースを整理する方法について支援が必要です。その方法については、すでにWeb上のいくつかのチュートリアル(特に これ )に従っています)、説明したように、そして私がそれをどのように想像したかは機能しません。

python binaryioという名前のパッケージを作成します。ユーザーができるようにしたいBinaryReaderおよびBinaryWriterという名前の2つのクラスを提供する必要がありますインポートする

from binaryio import BinaryReader
from binaryio import BinaryWriter

したがって、次のようにリポジトリとパッケージのディレクトリ構造を作成しました。

  • binaryio(リポジトリルート)
    • binaryio(パッケージルート)
      • __ init __。py(s。以下)
      • binaryreader.pyBinaryReaderクラスを含む)
      • binarywriter.pyBinaryWriterクラスを含む)
    • setup.pysetuptools.setup呼び出し)
    • 。gitignoreREADME.md[〜#〜]ライセンス[〜#〜]、...

ご覧のように、クラスは別のファイルにあります(これはC#のバックグラウンドからのものです)。モジュールがPython=の「ユニット」であるため、これが良いアイデアかどうかはわかりませんが、それ以外の場合、すべてのクラスを1つの巨大なファイルにまとめることは、私には論理的に思えませんでした。

__ init __。pyは、これらのクラスをインポートするために次のようになり、(私が理解しているように)from binaryio import BinaryReader後でユーザーがインポートできる:

from binaryreader import BinaryReader
from binarywriter import BinaryWriter

ただし、パッケージをローカルにインストールし(正常に動作するようです)、import binaryio、次のエラーが発生します。

>>> import binaryio
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Projects\Git\binaryio\binaryio\__init__.py", line 1, in <module>
    from binaryreader import BinaryReader
ModuleNotFoundError: No module named 'binaryreader'

どうやら、__ init __。pyファイルに問題があります。 binaryreader.pyファイル別名モジュールが上記のように同じフォルダーに存在するので、私はこれを理解していません。おかしなことに、my IDE(PyCharm、パッケージルートをソースフォルダとして設定している)はその中のステートメントについて文句を言わず、すべての参照を解決できます。

ここで何が悪いのですか?上記のリンク先のチュートリアルによると、Abcという名前のクラスでファイルをxyz.pyに入れてから、from xyz import Abc into__ init __。pyは機能するはずですが、明らかに私には機能しません。

10
Ray

コードはPython 2.xでは機能しますが、3.xでは機能しません。相対インポートの構文が異なるためです。ドットがない場合、Python 2.xはモジュールルートのモジュールand現在のパッケージ、およびPython 3.xはモジュールルートのonlyを検索します。

使用するインポートステートメントは次のとおりです。

from binaryio.binaryreader import BinaryReader
from binaryio.binarywriter import BinaryWriter

Python 2.xと3.xの両方で機能し、「将来」はありません。

6
bakatrouble

私はあなたのインポートステートメントにドットを追加する必要があると思います:

from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter
3
Xatyrian