2014-11-13 150 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