假设welcome
在 中easygui.py
,您想要:
def main():
externals.easygui.welcome()
由于这些东西输入起来很乏味,通常习惯于以缩写名称导入子包:
import externals.easygui as eg
def main():
eg.welcome()
或者,如果您可以通过添加将整个东西变成一个包__init__.py
,然后您可以控制从那里导入的命名空间......
就横向导入而言,这是我设置的测试目录结构:
steffen
|- __init__.py
|- main.py
|- easygui
|- __init__.py
|- gui.py
|- external
|- __init__.py
|- welcome.py
现在,(为简单起见)每个都__init__.py
简单地导入该目录中包含的文件/模块。所以,在 steffen:
#steffen.__init__.py
import main
import easygui
import external
并且在外部
#steffen/external/__init__.py
import welcome
等等。
对于实际代码:
主要.py:
import easygui
def main():
easygui.gui.welcome()
easygui/gui.py:
import steffen.external as se
def welcome():
se.welcome.hello()
外部/welcome.py
def hello():
print "Hello"
现在我可以使用所有这些了。在 steffen 的父目录中(只是为了确保 steffen 包在 PYTHONPATH 上),我可以:
import steffen
steffen.main.main()
呸!现在,拥有steffen.main.main()
. 如果您想将函数称为 just steffen.main()
,您可以在 中进行设置steffen.__init__.py
。只需将其更改为:
#steffen.__init__.py
from main import main
import easygui
import external
所以,如果你通过foo.func()
in调用一个函数__init__.py
,你会像steffen.foo.func()
在 import 的脚本中那样调用它steffen
。同样,如果您将函数调用为foo()
in __init__.py
,您将steffen.foo()
在导入 steffen 的脚本中调用它。希望这是有道理的。在我能想出的这个最简单的工作示例中,有很多东西需要消化。好处是,如果你能完成所有这些工作并理解它,那么你几乎知道关于编写 python 包的所有知识(我们还没有讨论过这里也可以使用的相对导入,或者关于setup.py
实际编写一个安装你的包,但是一旦你理解了这些东西,这些就很容易理解了)。