在同一模块内引用文件的正确方法

3 投票
1 回答
1349 浏览
提问于 2025-04-17 12:53

我在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 个回答

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版本开始,上面的语句只会被解释为绝对导入,而不会查找相对导入。明确的绝对导入在这两个版本中都会按预期工作。

撰写回答