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

时间:2013-05-28 07:42:41

标签: python package python-import python-module

这是我的包层次结构

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。 所以我给了     app1.py内的import app.global_vars.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,我收到上述错误

我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

如果您将app/server.py作为脚本运行,则app的父目录不会添加到sys.path()。而是添加app目录本身(不是作为包而是作为导入搜索路径)。

您有4个选项:

  1. 移动server.py包裹旁边的app
  2. app旁边添加一个仅运行的新脚本文件:

    from app import server
    server.main()
    
  3. 使用-m switch option运行模块作为主要入口点:

    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包和 app包中包含的模块都在sys.path上。您可以导入app.serverserver,Python会将这些模块视为两个独立的模块,每个模块在sys.modules中都有自己的条目,并且它们的全局变量都是单独的。

答案 1 :(得分:0)

需要__init__.py文件,将其视为包

应用
| --server.py
| --global_vars.py
| --handlers

| - __init__.py ...

__init__.py可以为空