如何为所有功能导入模块?

时间:2012-10-10 12:20:08

标签: python import module

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

该程序通过main.py

启动

我使用import externals.easygui在main.py中导入easygui。我导入modules.gui

的方式相同

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

如何解决这个问题?

提前致谢!

斯蒂芬

示例(没有try / except和注释内容的可读性):

main.py:

#!/usr/bin/env python

import externals.easygui
import modules.gui

main():
    gui.welcome()

gui.py:

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

3 个答案:

答案 0 :(得分: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

等等。

表示实际代码:

<强> main.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()有点傻了。如果您想仅将该功能称为steffen.main(),则可以在steffen.__init__.py中进行设置。只需将其更改为:

#steffen.__init__.py
from main import main
import easygui
import external

因此,如果您要在foo.func()中通过__init__.py调用某个函数,则会在导入steffen.foo.func()的脚本中将其称为steffen。同样,如果您在foo()中将该函数称为__init__.py,则会在导入steffen的脚本中将其称为steffen.foo()。希望这是有道理的。在我能提出的这个最简单的工作示例中,有很多要消化的东西。好处是,如果你可以完成所有这些并理解它,那么你几乎知道编写python包的所有内容(我们还没有谈到可以在这里使用的相对导入,或者关于编写{{ 1}}实际安装你的软件包,但是一旦你理解了这些东西,这些就很容易理解了。)

答案 1 :(得分:0)

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

例如。 gui.py

from externals.easygui import msgbox

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

答案 2 :(得分:0)

我们在这里有什么......

导入gui.py模块并给它命名为gui,这样你只需要使用gui标签来访问gui中的函数。

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

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

main.py

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")