2017-08-01 15 views
8

現在、Python3で動作し、絶対インポートを使用して別のモジュールにモジュールをインポートしようとしましたが、エラーModuleNotFoundError: No module named '__main__.moduleB'; '__main__' is not a packageが発生します。このプロジェクト構造を考えてみましょう:ModuleNotFoundError: '__main __。xxxx'という名前のモジュールはありません。 '__main__'はパッケージではありません

proj 
    __init__.py3 (empty) 
    moduleA.py3 
    moduleB.py3 

moduleA.py3

from .moduleB import ModuleB 
ModuleB.hello() 

moduleB.py3

class ModuleB: 
    def hello(): 
     print("hello world") 

その後python3 moduleA.py3を実行するとエラーが発生します。ここで何を変更する必要がありますか?

ありがとうございました!

+0

先頭の '。'それが入っているファイルがパッケージに入っているときだけ、あなたが望むように動作します。 – anonymoose

+2

@anonymooseはパッケージではなく「proj」ですか?それは__init __を持っているからです。py3? – mpseligson

+1

先頭に '。'を使用することはできません。あなたがPythonで直接ファイルを実行しているときに、あなたが望むように動作します。ファイルをインポートする必要があります。 'import moduleA'を含む' proj'の外側に別のファイルを置いた場合、あなたは期待している出力を見ることができると思います。 – anonymoose

答えて

2

.moduleBは相対的なインポートです。相対モジュールは、親モジュールを最初に読み込んだり読み込んだ場合にのみ機能します。つまり、現在の実行環境のどこかにprojをインポートする必要があります。コマンドpython3 moduleA.py3を使用している場合、親モジュールをインポートする機会はありません。次のことができます。

  • from proj.moduleB import moduleB OR
  • あなたは、Pythonの素晴らしい土地への旅でfrom proj import moduleA

幸運を呼び出すために、のはrun.pyを言わせて、別のスクリプトを作成することができます。

関連する問題