1

我有一个名为“main.py”的主文件和两个子文件夹。一个称为“externals”,包含“easygui.py”,另一个称为“modules”,包含一个名为“gui.py”的文件。

该程序通过 main.py 启动

我在 main.py 中使用import externals.easygui. 与我导入 modules.gui 的方式相同

但是当我调用welcome-function时,它不知道easygui,我必须在函数中导入它。由于我想调用更多的easygui 函数,我不想在每个def 中都导入easygui。

如何解决?

提前致谢!

史蒂芬

示例(为了便于阅读,无需 try/except 和注释内容):

主要.py:

#!/usr/bin/env python

import externals.easygui
import modules.gui

main():
    gui.welcome()

gui.py:

def welcome():
    msgbox("Welcome!", ok_button="Ok")
4

3 回答 3

3

假设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实际编写一个安装你的包,但是一旦你理解了这些东西,这些就很容易理解了)。

于 2012-10-10T12:22:27.343 回答
0

每个源文件都需要有自己的导入,因为它们不知道其他模块的导入。您必须在文件顶部包含一个import externals.easyguiin 。modules.gui.py

例如。gui.py

from externals.easygui import msgbox

def welcome():
    msgbox("Welcome!", ok_button="Ok")
于 2012-10-10T12:27:14.593 回答
0

我们这里有什么...

导入 gui.py 模块并将其命名为 gui,这样您只需使用 gui 标签即可访问 gui 中的功能。

在 gui.py 模块中只导入函数 msgbox,这样你就没有导入其他东西(如你所愿)。

现在,当程序运行时,它会显示调用 gui.welcome 函数的消息。

主文件

import modules.gui as gui

def main():
    gui.welcome()

if __name__ == "__main__":
    main()

子文件夹模块中的 gui.py

from externals.easygui import msgbox

def welcome():
    msgbox("Welcome!", ok_button = "Ok")
于 2017-07-09T04:43:51.947 回答