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

2024-04-19 02:01:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个主文件,叫做'主.py'和两个子文件夹。其中一个被称为“externals”并包含轻松.py'另一个叫做'modules'包含一个名为'图形用户界面.py'. 在

程序通过主.py在

我进口易趣主.py使用import externals.easygui。和我进口的方式一样模块.gui在

但是当我调用welcome函数时,它并不知道easygui,我必须将它导入函数中。因为我想调用更多的easygui函数,所以我不想在每个def中都导入easygui。在

如何解决这个问题?在

提前谢谢!在

斯特芬

示例(不带try/except和comment内容的可读性):

在主.py公司名称:

#!/usr/bin/env python

import externals.easygui
import modules.gui

main():
    gui.welcome()

在图形用户界面.py公司名称:

^{pr2}$

Tags: 文件函数pyimport程序文件夹名称modules
3条回答

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

例如。图形用户界面.py在

from externals.easygui import msgbox

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

我们这里有什么

导入图形用户界面.py模块并将其命名为gui,这样您只需使用gui标签就可以访问gui中的函数。在

在图形用户界面.py模块只导入函数msgbox,这样就不会导入其他东西(正如您所希望的那样)。在

现在,当程序运行时,它会显示调用桂。欢迎功能。在

在主.py在

import modules.gui as gui

def main():
    gui.welcome()

if __name__ == "__main__":
    main()

在图形用户界面.py在子文件夹模块中

^{pr2}$

假设welcomeeasygui.py中,您需要:

def main():
   externals.easygui.welcome()

由于键入这些内容可能会变得乏味,因此通常会以缩写名称导入子包:

^{pr2}$

或者,如果您可以通过添加__init__.py使整个东西成为一个包,然后您可以控制从那里导入的命名空间。。。在


至于横向导入,我设置了一个测试目录结构:

steffen
  |- __init__.py
  |- main.py
  |- easygui
     |- __init__.py
     |- gui.py
  |- external
     |- __init__.py
     |- welcome.py

现在,(为了简单起见)每个__init__.py只导入该目录中包含的文件/模块。所以,在斯特芬:

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

在外部

#steffen/external/__init__.py
import welcome

等等。在

对于实际代码:

主.py:

import easygui
def main():
    easygui.gui.welcome()

轻松/图形用户界面.py:

import steffen.external as se
def welcome():
    se.welcome.hello()

外部/欢迎光临.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

因此,如果您在__init__.py中通过foo.func()调用函数,那么在导入steffen的脚本中将其称为steffen.foo.func()。同样,如果在__init__.py中将函数调用为foo(),那么在导入steffen的脚本中将其称为steffen.foo()。希望这有道理。在这个我能想到的最简单的工作示例中,有很多东西需要消化。好的一面是,如果你能完成所有这些并理解它,那么你就知道了编写python包的所有知识(我们还没有讨论过在这里也可以使用的相对导入,或者编写一个setup.py来实际安装包,但一旦你理解了这些东西,这些东西就很容易理解了)。在

相关问题 更多 >