2017-06-03 21 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中的所有目录。