在同一模块内引用文件的正确方法
我在Google App Engine上开发一个应用,使用了这段代码。我遇到了一些关于如何引用文件的问题。比如,在__init.py__
文件中,decorators.py、errors.py等文件是这样被引入的:
import reddit.decorators
import reddit.errors
import reddit.helpers
import reddit.objects
因为这些文件都在同一个模块里,难道不应该这样引入吗:
import decorators
import errors
import helpers
import objects
绝对引用只有在reddit包在系统路径上时才有效,但在Google App Engine上似乎并不是这样,不知道是什么原因。
这是源代码的问题,还是我需要更仔细地检查一下我在Google App Engine上的应用配置呢?
1 个回答
如果你想使用一个包,你需要把整个包的目录安装到一个Python可以找到的地方,也就是放到sys.path
里包含的目录中。你绝对不要试图把包里的内容当作独立模块来使用,因为这不是这个包的设计初衷。
由于你主脚本的工作目录(.
)已经在sys.path
里,所以你只需要把整个reddit
包的目录放在和你的主脚本同一个目录下,就可以直接使用这个包了。如果在Google App Engine中无法import reddit
,那你需要检查一下那里的设置。不幸的是,我对GAE的工作原理和你可以在那儿安装什么并不太了解,但我猜应该是可以的,因为他们允许你把任意的Python模块和包放到你的网络空间里,对吧?
关于你最初的问题,你提到的手册部分是错的。对于包内引用,你应该使用绝对导入:
import reddit.decorators as decorators
或者相对导入:
from . import decorators
绝对导入的语法是否有效取决于你的Python版本。这一点有点模糊:
import decorators
你是指全局模块(/decorators.py
)吗?还是包内的模块(/reddit/decorators.py
)?Python 2.x会先查找相对导入,如果找不到再尝试绝对导入。从2.6版本开始,绝对导入的写法被认为是不推荐使用的,应该避免使用。从3.0版本开始,上面的语句只会被解释为绝对导入,而不会查找相对导入。明确的绝对导入在这两个版本中都会按预期工作。