8

これは私のパッケージ階層です

app  
|--__init__.py    //Empty file
|--server.py  
|--global_vars.py  
|
|--handlers    
   |--__init__.py    //Empty file
   |
   |--url1
   |  |--__init__.py    //Empty file
   |  |--app1.py
   |  |--app2.py
   |
   |--url2
      |--__init__.py    //Empty file
      |--app3.py

global_vars.py今、私は中にインポートしたいapp1.py。だから私は import app.global_vars.pyapp1.py の中で与えました。

しかし、次のエラーが表示されます。

    import app.global_vars
ImportError: No module named app.global_vars

また、server.py から app1.py をインポートしていることにも言及する必要があります。server.py私が実際に実行しているファイルです。server.py が app1.pyをインポートするとapp1.py、インポートしようとするglobal_vars.pyと、上記のエラーが発生します

ここで何が間違っていますか?

4

2 に答える 2

14

app/server.pyスクリプトとして実行している場合、 の親ディレクトリappは に追加されませんsys.path()。代わりにappディレクトリ自体が追加されます (パッケージとしてではなく、インポート検索パスとして)。

次の 4 つのオプションがあります。

  1. パッケージから移動server.py appます (その隣)
  2. appのみ実行される新しいスクリプト ファイルの横に追加します。

    from app import server
    server.main()
    
  3. モジュールをメイン エントリ ポイントとして実行するには、 -mswitch オプションを使用します。

    python -m app.server
    
  4. の親ディレクトリを にserver.py追加sys.path:

    import os.path
    import sys
    
    parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.insert(0, parent)
    

    ただし、この最後のオプションではさらに問題が発生する可能性があります。これでappパッケージとパッケージに含まれるモジュールの両方が on になりました。と の両方をインポートすることができ、Python はこれらを 2 つの別個のモジュールとして認識し、それぞれが に独自のエントリを持ち、それらのグローバルの別個のコピーを持ちます。appsys.pathapp.serverserversys.modules

于 2013-05-28T08:09:47.400 に答える