2017-06-03 22 views
2

的同級目錄:導入蟒模塊在包相鄰鑑於以下Python項目結構程序

  • example_dir
    • alpha.py
    • beta.py
    • 智/ __ init__.py
    • chi/delta.py
    • epsilon/__ init__.py
    • 小量/ fudge.py

alpha.py包含:

from beta import beta_var 
print(beta_var) 

from chi.delta import delta_var 
print(delta_var) 

from epsilon.fudge import fudge_var 
print(fudge_var) 

beta.py包含:

from chi.delta import delta_func 

beta_var = delta_func() 

chi.py包含:

delta_var = 42 

def delta_func(): 
    return 69 

而且fudge.py包含:

from chi.delta import delta_func 

fudge_var = delta_func() 

我可以直接運行alpha.py預期。

我也可以運行beta.py

但是當我運行fudge.py,無論是通過python epsilon/fudge.pycd epsilon && python fudge.py,Python的顯示錯誤:

導入錯誤:沒有模塊名爲chi.delta

如何運行軟糖。 py直接成功訪問delta_func定義在delta.py,同時仍然能夠運行alpha.py?理想情況下,我想從epsilon子目錄中調用python fudge.py

我以爲我理解了Python模塊和包的基礎知識,但也許我沒有,因爲這似乎比它需要更加困難!

+0

你能夠做到:'from ..chi.delta import delta_func'? –

+0

啊,我明白了。 'example_dir'文件夾中沒有'__init __。py'。創建它,它應該工作 –

+0

@MoinuddinQuadri創建_example_dir/\ _ \ _ init \ _ \ _。py_並使用'..chi.delta'既不_alpha.py_也不_fudge.py_工作。運行_alpha.py_引發_ValueError:嘗試相對導入超出頂層package_。運行_epsilon/fudge.py_會引發_ValueError:試圖在非package_中進行相對導入。 – ybakos

回答

1

您可以像這樣直接運行:

python -m epsilon.fudge 

...只要你的當前工作目錄是example_dir。 (不幸的是,我不知道有什麼方法可以在epsilon目錄中運行腳本。)


簡單的解釋:總之,這將迫使Python來運行你的腳本作爲包的一部分。

這允許你做:

from chi.delta import delta_func 

fudge.py,即使delta.py是分離chi目錄。它的工作原理是(在這種情況下)做python -m將腳本作爲包的一部分運行,其中包含example_dir中的所有目錄。