这是我的包层次结构
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
,我收到上述错误
我在这里做错了什么?
答案 0 :(得分:7)
如果您将app/server.py
作为脚本运行,则app
的父目录不会添加到sys.path()
。而是添加app
目录本身(不是作为包而是作为导入搜索路径)。
您有4个选项:
server.py
包裹旁边的app
在app
旁边添加一个仅运行的新脚本文件:
from app import server
server.main()
使用-m
switch option运行模块作为主要入口点:
python -m app.server
将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.server
和server
,Python会将这些模块视为两个独立的模块,每个模块在sys.modules
中都有自己的条目,并且它们的全局变量都是单独的。
答案 1 :(得分:0)
需要__init__.py
文件,将其视为包
应用
| --server.py
| --global_vars.py
| --handlers
| - __init__.py
...
__init__.py
可以为空