2016-10-06 57 views
2

這種結構僅僅是一個例子多個相對進口3.5

pkg\ 
    test\ 
    __init__.py 
    test.py 
    __init__.py 
    source.py 
    another_source.py 

another_source.py

class Bar(): 
    def __init__(self): 
    self.name = "bar" 

source.py

from another_source import Bar 
class Foo(): 
    def __init__(self): 
    self.name = "foo" 
    b = Bar() 

test.py

from ..source import Foo 

if __name__== "__main__": 
    f = Foo() 
    print(f.name) 

現在我想運行test.py. 因爲它已被接受爲answer我得走了我目前的包裝上面並運行

python -m pkg.test.test 

但是,這並不工作,蟒蛇給了我一個回溯

Traceback (most recent call last): 
    File "-\Python35\lib\runpy.py", line 170, in _run_module_as_main 
    "__main__", mod_spec) 
    File "-\Python35\lib\runpy.py", line 85, in _run_code 
    exec(code, run_globals) 
    File "~\test\test.py", line 1, in <module> 
    from ..source import Foo 
    File "~\source.py", line 1, in <module> 
    from another_source import Bar 
ImportError: No module named 'another_source' 

如果我刪除所有another_source - 它會工作,但這不是一個解決方案。

現在是否有一種理智的方式從上方的目錄中導入類?

+1

'如果我沒有記錯,從pkg.source import Foo'。 –

回答

1

pkg.source正試圖從pkg.another_source模塊導入東西,就像它是頂層一樣。該進口需要更正:

from .another_source import Bar 
# or 
from pkg.another_source import another_source 
+0

但後來我的主腳本導入(與source.py相同的目錄)失敗。 – Nozdrum

+0

@Nozdrum:那麼當你運行這些程序時,你可能不會一致地知道程序包層次結構的起始位置。你需要從'pkg'目錄上面運行'python -m pkg.whatever',或者你需要放置一些樣板來修復'__package__'和'sys.path',這在這裏不太好解釋(但是閱讀[PEP 366](https://www.python.org/dev/peps/pep-0366/)將是一個好的開始)。 – user2357112

+0

如果我運行我的main.py,就像運行我的test.py一樣。但對於我爲什麼它有效,它確實沒有任何意義。 -m開關說它在那裏「將庫模塊作爲腳本運行」,但我沒有運行任何庫模塊。我正在運行一個「主」腳本,就像我的test.py不是一個庫,而是一個測試用例。 – Nozdrum