我有一个名为'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")
答案 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函数的消息。
import modules.gui as gui
def main():
gui.welcome()
if __name__ == "__main__":
main()
子文件夹模块中的from externals.easygui import msgbox
def welcome():
msgbox("Welcome!", ok_button = "Ok")