项目结构如下:
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
?
提前致谢。
答案 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/
加载模块。