2013-12-15 4 views
11

この質問はここで何度も尋ねられていますが、私はおそらく答えのほとんど(thisthatを含む)私は非常に簡単なインポートの問題の答えを見つけることができません。私は何か愚かなことを逃さなければならないほど簡単ですが、私はまだそれを見ません。 私はセットアップに以下の構造を有する:Pythonはディレクトリ内の__init.py__という名前のファイルでもサブディレクトリからモジュールをインポートできません

myproject 
    myscript.py 
    MyPackage 
     __init.py__ 
     mymodule.py 

私はちょうどmymodule.pmyscript.pyからY(または同じであるべきコマンドラインPythonインタプリタ)をロードします。

myscript.pyは含まれています

#!/usr/bin/python 
import MyPackage 

__init.py__は含まれています

from . import mymodule 

mymodule.pyは、私の目標はmyscript.pyからmyfunctionを呼び出すことですが、私がしようとした場合

#!/usr/bin/python 

def myfunction(): 
    print "mymessage" 

が含まれています

  • 私は障害のあるPythonのインストールの可能性を低減するために、OSXとUbuntu Linuxの下のすべてのものを試してみました:私はすでに試した

    $python myscript.py 
    Traceback (most recent call last): 
        File "myscript.py", line 2, in <module> 
        import MyPackage 
    ImportError: No module named MyPackage 
    

    ものを手に入れるモジュールを呼び出します。

  • 環境変数をmyprojectディレクトリに設定し、.ディレクトリとその両方に設定しました。
  • 私は、次のimport文を試してみましたまた、Pythonインタプリタからのインポート文がmyprojectディレクトリから
  • を開始しようとした

  • __init.py__空白のままに:同じエラーメッセージ(

    from MyPackage import mymodule 
    import MyPackage.mymodule 
    import MyPackage.mymodule as module 
    

    すべての成功なし)。

mymodule.pyをプロジェクトディレクトリにパッケージを使用せずに置くと、インポートが正常に動作します。しかし、なぜサブパッケージからのインポートが機能していないのかわかりません。 どのように私はそれを働かせることができますか?

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

+0

'myproject'ディレクトリが' sys.path'にリストされているかどうかを確認する必要があります。 'MyPackage'をインポートする前に、' sys.path'に正しいディレクトリが入っていますか? –

+0

私がインタプリタを起動し、 'import sys'と' print sys.path'を実行すると、 "myproject"ディレクトリのパスを正しく含むリストが表示されます: '[''、 '/ Users/michael/Entwicklung/python/myproject '、...] ' – mhelwig

+0

パッケージをインポートできるようにする必要があります。パッケージには*別の*インポートエラー*がある可能性があります。既に空の '__init __。py'を試したと言っています。もう一度試してみることができますが、すべての '* .pyc'ファイルを削除してください。おそらく '__init __。py'に単一の' print 'インポートされた ''行を追加してください。 –

答えて

7

投稿の書式を編集しているうちに、ファイル__init.py_を呼び出していることがわかりました。そのため、pythonはMyPackageディレクトリをパッケージとして認識しません。したがって、ImportError: No module named MyPackageです。

その代わり__init__.py(名前__init__、拡張.py)であるべきです。それがうまくいくと、あなたのプロジェクトの構造とインポートステートメントが正しくなります。

1つのマイナーポイント:あなたのパッケージの名前付けには、lower_underscoreスタイルも使用する必要があります。パッケージはPythonのモジュールでもあり、同じ命名規則に従うべきです。推奨されるスタイルと命名規則の詳細については、PEP8を参照してください。これはちょうどの慣例ですが、あなたの問題とは関係ありません。

+0

Pythonでは大文字と小文字が区別されるため、Windowsでもパッケージの構造とインポートが一致しません。 –

+0

これは確かに、彼の記述では完全に一致しています。彼はパッケージ 'MyPackage'を呼び出して' import MyPackage'とモジュール 'mymodule.py'をインポートし、それを' import .. mymodule' 。ケーシングをモジュールとパッケージの間で同期させることは全く必要ありません。 –

+1

うわー、私は本当にこの問題に苦しんで3時間以上過ごしたことに感銘しました。ドキュメントを何度も読んでいても、あなたが見つけた '__init __。py'の間違った名前を見落としました。完璧!さて、それは最終的に動作しますので、あなたの答えに感謝! – mhelwig

関連する問題