2014-11-13 111 views
3

考虑下面的例子包:相对导入失败

example/ 
├── bar.py 
├── foo.py 
└── __init__.py 

foo.py只包含一个行代码:from . import bar

如果我从example包根内执行python foo.py,我得到:

SystemError: Parent module '' not loaded, cannot perform relative import

我在做什么错?

回答

2

当您运行python foo.py时,foo.py不是example模块的一部分。创建__main__.py以运行foo.py的相关部分(通常不应该在顶层运行任何代码),切换到父目录,然后尝试python -m example

例如,foo.py

def hello(): 
    print('Hello, world!') 

__main__.py

from . import foo 

foo.hello() 
+0

谢谢!它似乎工作,你能解释一下你的评论:“它不应该在顶层运行任何代码,通常”?你指的是'foo.py',你的意思是'foo.py'模块在刚导入时不应该运行任何代码? –

+0

@DunPeal:是的,确切地说。 – Ryan

+1

更具体地说:当你运行一个文件为'python a/b/c.py'时,python将'a/b /'加入'sys.path'。不要运行任何应该作为模块层次结构的一部分的文件名。总是坐在父目录下并用'-m'运行它。 (如果你真的想这么做,你可以在这里使用'-m example.foo'。) – Eevee