从更高的层次包装的Python进口模块

问题描述 投票:4回答:2

这是我包层次

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

我在做什么错在这里?

python package python-import python-module
2个回答
9
投票

如果你是作为一个脚本运行app/server.pyapp的父目录未添加到sys.path()。该app目录本身,而不是被添加(而不是作为一个包,但作为进口搜索路径)。

你有4个选项:

  1. 移动server.pyapp封装(它旁边)
  2. 旁边的添加新的脚本文件,以app只运行: from app import server server.main()
  3. 使用-m switch option运行模块为主要切入点: python -m app.server
  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) 最后一个选项可以引入却更问题;现在app包和包含在app包模块都是上sys.path。你可以导入这两个app.serverserver和Python会看到这些作为两个独立的模块,每个模块在sys.modules自己的条目,与他们全局的单独副本。

0
投票

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

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

| --Qazxswpoi ...

__init__.py可以是空的

© www.soinside.com 2019 - 2024. All rights reserved.