我知道import *
很糟糕,但是当我觉得懒得键入或记住导入时,我有时会用它来快速进行原型设计
我正在尝试以下代码:
from OpenGL.GL import *
shaders.doSomething()
导致错误:`NameError:全局名称'着色器'未定义'
如果我更改导入:
from OpenGL.GL import *
from OpenGL.GL import shaders
shaders.doSomething()
错误消失。为什么*
不包含shaders
?
答案 0 :(得分:8)
如果shaders
是子模块且it’s not included in __all__
,from … import *
将无法导入。
答案 1 :(得分:3)
shaders
是一个子模块,而不是一个函数。
语法from module import something
不导入子模块(如__all__
中未定义的另一个答案所述)。
要获取该模块,您必须专门导入它:
from OpenGL.GL import shaders
或者,如果您只想拥有shaders
的一些功能:
from OpenGL.Gl.shaders import function1, function2, function3
如果您想拥有shaders
的所有功能,请使用:
from OpenGL.Gl.shaders import *
希望这有帮助!
答案 2 :(得分:0)
我从自己的情况中学到了这一点。模块未自动导入包的其余部分。在那次体验之前,我的错误理解是每个软件包的模块都会自动从import x
或from x import *
导入。他们没有。
初学者可能期望在这些电话下导入一切,我相信。但是下面的GUI编程代码很常见,表明情况并非如此:
from tkinter import *
from tkinter import ttk
在上面的示例中,模块ttk
不会与tkinter
包的其余部分一起自动导入。
我被告知的解释如下:当您使用from x import *
时,实际上只导入了your-python-location/lib/x/__init__.py
中的内容
包是文件夹。模块是文件。如果导入调用特定文件,则包文件夹__init_.py
将枚举要导入的特定文件。