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

时间:2012-02-12 11:19:41

标签: python

我在Google App Engine中的某个应用中使用了this code。我遇到了引用单个文件的问题。例如,在__init.py__中,文件decorators.py,errors.py等导入如下:

import reddit.decorators
import reddit.errors
import reddit.helpers
import reddit.objects

由于这些文件都在同一个模块中,因此不应该像instead那样导入它们:

import decorators
import errors
import helpers
import objects

绝对引用仅在reddit包位于系统路径上时才有效,出于某种原因,这似乎不是Google App Engine中的情况。

这是源问题,还是我需要更仔细地检查Google App Engine中的应用配置?

1 个答案:

答案 0 :(得分:0)

如果要使用包,则必须在Python可以找到的地方安装整个目录,即安装在sys.path中的目录。您永远不应该尝试将包内容用作独立模块,因为这不是包的设计方式。

由于主脚本(.)的工作目录位于sys.path,因此您应该只需将整个包目录放在同一目录中即可使用reddit包作为你的主要脚本。如果您在Google App Engine中无法import reddit,则必须在那里检查您的设置。不幸的是,我不知道GAE如何工作或者你可以在那里安装什么,但我想它应该可行,因为它们允许你将任意Python模块和软件包放到你的网站空间,不是吗?

关于您的原始问题,您正在参考本手册的错误部分。对于intra-package references,您应该使用绝对导入:

import reddit.decorators as decorators

或相对的:

from . import decorators

如果绝对导入语法有效,则取决于您的Python版本。这是不明确的:

import decorators

您的意思是全局模块(/decorators.py)吗?或者包中的模块(/reddit/decorators.py)? Python 2.x将首先查找相对导入,然后尝试绝对导入,如果相对导致失败。从2.6版开始,不推荐使用绝对式导入,不应再使用它。从3.0开始,上面的语句只会被解释为绝对导入,而不是寻找相对的语句。显式绝对导入将在两个版本中按预期工作。