导入__init__.py中指定的变量

时间:2014-10-07 18:18:13

标签: python import init

项目结构如下:

proyect/
  run.py
  app/
     __init_.py
     file.py

__init__.py有:

# At __init__.py
app = "My var"

我想在app内使用file.py变量;我正在做:

# At file.py
from app import app
print app

但我得到了:"ImportError: No module named app"

变量最好位于__init__.py,而不更改,我如何使用app中的file.py

提前致谢。

3 个答案:

答案 0 :(得分:1)

导入它,就像从普通.py文件导入一样,如下所示:

from __init__ import app
print app

结果:

My var

目前的情况(from app import app),python会在 当前工作目录中查找名为app 的模块或文件,它显然不会找到,所以会抛出ImportError

答案 1 :(得分:0)

您正在从__init__.py正确导入。

您在bash提示符处运行的是什么来获取ImportError,以及proyect/run.py文件的内容是什么?

如果我proyect/run.py包含以下内容:

from app import file

然后从命令行运行proyect/run.py会得到预期的结果(打印My var)。但是,尝试从命令行运行proyect/app/file.py会给出您描述的错误。

一般来说,这些导入问题是我过去听过的原因,即保留用户可能希望在项目的根目录中运行的任何脚本(例如proyect/run.py此处)而不是在子目录中(例如proyect/app/run.py)。我不完全确定Python内部导致两者之间导入语义的差异,但这对我有用。

答案 2 :(得分:0)

首先,您缺少proyect/__init__.py(它可以为空)以使proyect成为Python包。

接下来,您需要在file.py

中使用相对导入
from ..app import app

要理解为什么需要特定的语法,让我们看看一些不正确的导入,看看他们会尝试加载什么:

  • from app import app - 将app.py中的模块加载到与file.py相同的目录中(如果失败,则从标准库中加载)
  • from .app import app - 从app.py中的proyect/app/加载一个模块(与前一个案例相同,实际上;这只是一个显式的相对导入,阻止了绝对导入的尝试)< / LI>

因此,..app在当前项目中进一步上升一个目录,并从app.py中的proyect/加载模块。