Python相对导入导致SyntaxError异常

sci*_*tor 5 python import syntax-error

根据python文档,自python 2.5开始支持相对导入和内部包引用。我当前正在运行Python 2.7.3。因此,我尝试在自己的程序包中实现此功能,以便将其用于更简单的导入。我很惊讶地发现它引发了SyntaxError异常,我希望有人可以帮助您找到原因。

我设置了一个测试目录进行测试:

tester
??? __init__.py
??? first_level.py
??? sub
    ??? __init__.py
    ??? second_level.py
Run Code Online (Sandbox Code Playgroud)

两个__init__.py模块都为空。其他模块是:


# first_level.py
print "This is the first level of the package"
Run Code Online (Sandbox Code Playgroud)
# sub/second_level.py
import ..first_level
print "This is the second level"
Run Code Online (Sandbox Code Playgroud)

当我尝试导入second_level模块时,出现以下错误:

Python 2.7.3 (default, Aug  1 2012, 14:42:42) 
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.57))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Welcome!
>>> import tester
>>> import tester.sub.second_level
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tester/sub/second_level.py", line 1
    import ..first_level
           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我希望这两行可以一个接一个地打印,但是却引发了异常。那么,我导入错误吗?你还有其它的想法吗。

Bre*_*arn 9

您不能导入类似的模块。 import ..blah是无效的导入语法。你需要做from .. import first_level

  • 基于 [官方文档](https://docs.python.org/2/tutorial/modules.html#intra-package-references),如果 `blah` 是一个包,这是有效的语法。检查上面链接中的示例,即“from ..filters import equalizer”,其中“filters”是一个包,“equalizer”是一个模块。你不应该那样概括。 (3认同)
  • @rbaleksandar:不,该示例使用`from`。从.blah导入东西是有效的。`import ..blah`不是。您只能将点符号相对导入与“导入”的“从”形式一起使用(如您链接到的文档中所述)。 (2认同)