web-dev-qa-db-ja.com

インポートエラーの受信:***という名前のモジュールはありませんが、__init__。pyがあります

この質問が何度か聞かれたことは理解していますが、それらを読み、提案された修正を行った後、私はまだ困惑しています。

私のプロジェクト構造は次のとおりです。

Project
      |
      src
        |
         root - has __init__.py
            |
            nested - has __init__.py
                  |
                  tests - has __init__.py
                  |
                  utilities - has __init__.py
                  |
                  services - has __init__.py

Eclipseからユニットテスト回帰クラスを問題なく実行できました。

コマンドラインから同じクラスを実行しようとするとすぐに(スイートを実行する他のユーザーはEclipseにアクセスできないため)、次のエラーが表示されます。

ImportError: No module named 'root'

上からわかるように、モジュールルートには__init__.pyがあります。すべての__init__.pyモジュールは完全に空です。

そして、支援をいただければ幸いです。

11
Mark Rowlands

インポートのリストにsys.path.appendを追加してみてください。

import sys
sys.path.append("/Project/src/")
import root
import root.nested.tests
17
Gus E

Gus Eがacceptの回答で示した内容といくつかのさらなる経験を使用して、この問題に到達した人へのメモは、マシンのコマンドラインからプログラムを実行できるようにするために非常に役立つことがわかりましたまたは必要が生じた場合は別の同僚に。

_import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), "..", ".."))
_

'nested'ディレクトリにある 'main'メソッドを実行すると、実行時に 'src'ディレクトリがPYTHONPATHに追加されるため、以降のすべてのインポートでエラーがスローされることはありません。

明らかに、メインメソッドが実行されるプログラム内の場所によって決定されるos.path.join()メソッドへの ".."引数の数を調整する必要があります

14
Mark Rowlands

パスなしでこれを解決するさらに別の方法は次のようになります。フォルダ名「app」内に3つのファイルx.py、y.py、および空のinit。pyがある次のコードを検討してください。したがって、x.pyを実行するには、次のようなyからのインポートがあります。

x.py

from app.y import say_hi
print ("ok x is here")
say_hi()

そして

y.py

print ("Im Y")
def say_hi():
    print ("Y says hi")

したがって、フォルダ構造は次のようになります。

testpy
       app
           __init__.py
           x.py
           y.py

解決策:フォルダー内[〜#〜] before [〜#〜]アプリは次のようにします。

$ python -m app.x

注:x.py(単にapp.x)は使用しませんでした

結果:

Nespresso@adhg MINGW64 ~/Desktop/testpy
$ python -m app.x
Im Y
ok x is here
Y says hi
1
adhg

誰かがここに着陸した場合:

私もこのエラーに遭遇しました。私の場合、path.sys.append(...)で_~/my/path/_を使用しましたが、修正により_~_が明示的なパス名に置き換えられました(pwdと入力すると問い合わせることができます) Linuxシェルを使用している場合、またはos.path.expanduser(..))を使用する場合

1
Yuval Atzmon