2013-11-09 26 views
6

我知道import *是不好的,但我有時用它快速原型當我覺得懶得打字或記住進口的Python:`從X導入*`沒有進口一切

我想下面的代碼:

from OpenGL.GL import * 

shaders.doSomething() 

這將導致一個錯誤:`NameError:全局名稱 '着色' 沒有定義」

如果我改變了進口:

from OpenGL.GL import * 
from OpenGL.GL import shaders 

shaders.doSomething() 

錯誤消失。爲什麼*不包括shaders

+1

看起來像'OpenGL.GL.shaders'是一個子包,而不是'OpenGL.GL'中定義的對象。 – Cameron

+0

着色器是一個模塊嗎? – sapi

+0

http:// stackoverflow。com/a/64130/1265154 – alko

回答

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 * 

希望能幫到您!

0

我從我自己的情況瞭解到了這一點。一個模塊不會自動與包的其餘部分一起導入。在此之前,我錯誤的理解是,每個軟件包的模塊自動從import xfrom x import *導入。他們不。

我相信初學者可能會期望所有東西都可以在這些調用下導入。但是,下面的GUI編程代碼,這是常見的,表明這是不是這樣:

from tkinter import * 
from tkinter import ttk 

在上面的例子中,模塊ttk不會自動與tkinter包的其餘部分一起導入,例如。

,我已經被告知的解釋如下:當您使用from x import *,你實際上只進口的東西your-python-location/lib/x/__init__.py

包是文件夾。模塊是文件。如果導入調用特定文件,則包文件夾的__init_.py將枚舉要導入的特定文件。

相關問題