Python从更高级别的包导入模块

Has*_*ken 4 python python-module package python-import

这是我的包层次结构

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
Run Code Online (Sandbox Code Playgroud)

现在我想在global_vars.py里面导入app1.py.所以我给了 import app.global_vars.pyapp1.py.

但是我收到以下错误:

    import app.global_vars
ImportError: No module named app.global_vars
Run Code Online (Sandbox Code Playgroud)

我还要提一下,我从server.py导入app1.py.server.py是我实际运行的文件.当server.py导入app1.py时,app1.py尝试导入global_vars.py,我得到上面提到的错误

我在这做错了什么?

Mar*_*ers 10

如果您app/server.py作为脚本运行,app则不会添加父目录sys.path().该app目录本身,而不是被添加(而不是作为一个包,但作为进口搜索路径).

你有4个选择:

  1. 移动server.py 所述的app包(它旁边)
  2. 添加一个新脚本文件旁边app只运行:

    from app import server
    server.main()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用-mswitch选项模块作为主入口点运行:

    python -m app.server
    
    Run Code Online (Sandbox Code Playgroud)
  4. 添加的父目录server.pysys.path:

    import os.path
    import sys
    
    parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.insert(0, parent)
    
    Run Code Online (Sandbox Code Playgroud)

    最后一个选项可能会引入更多问题; 现在两个app包和包含在模块app封装上sys.path.你可以导入两个app.server,server并且Python会将这些视为两个独立的模块,每个模块都有自己的条目sys.modules,并且它们的全局变量都是单独的.