关于 import 的一个语法问题,求解

2015-06-03 09:35:48 +08:00
 snopy
我建了一个目录树如下:
/app
/__init__.py
/user_service.py
现在我在__init__.py文件里边引用了Flask创建应用对象:
server_app = Flask(__name__)
且定义了版本信息:
API_VERSION = '0.1'
好了,现在我想在user_service.py里边引用server_app和API_VERSION,因此我用了import:
from ..app import server_app, API_VERSION
运行结果显示为:
from ..app import server_app, API_VERSION
ValueError: Attempted relative import in non-package
于是我想到是不是初始化之后不需要导入server_app和API_VERSION,直接用,运行结果为:
NameError: name 'server_app' is not defined
我查看了官方文档,并没有找到和此问题相关的结论,如果大婶知道的话,烦请指点迷雾!谢谢
2400 次点击
所在节点    Python
7 条回复
snopy
2015-06-03 09:37:55 +08:00
这里显示有问题,__init__.py和user_service.py是在app文件夹下的
skyline75489
2015-06-03 09:38:16 +08:00
确定是 init ? 不是 __init__.py? 确定是 from .. (两个点)?不是 from . (点)?
snopy
2015-06-03 09:42:05 +08:00
@skyline75489 确定是,我的python版本是2.7.9,应该和版本没关系吧
clino
2015-06-03 09:45:35 +08:00
我不是大婶
不过感觉上面说得对,感觉应该用一个点,因为是同级目录吧?
repus911
2015-06-03 10:38:49 +08:00
from . import ***
weyou
2015-06-03 11:05:20 +08:00
from . import server_app, API_VERSION
whiteblack
2015-06-03 11:53:41 +08:00
from . import server_app, API_VERSION 这个对。
之所以出现这个问题是因为相对导入这个东西只作用于包,你 “..” 找到的是app的上级目录,如果这个目录不是一个包,当然就不行了,如果一定要用 “..” 则需要在app这个文件夹所属的目录加个 __init__.py,使他成为一个包即可。
所以重点就是相对导入这个东西,只能在包环境里面使用,出了包就不行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/195697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX