2010-07-13 70 views
0

在運行時,Python代碼獲取要加載的子模塊的名稱,這是我之前不知道的。現在,我想檢查一下,如果這個子模塊存在於現有的模塊中。考慮這樣的結構,其中foobar可以指定:如何使用hasattr在Python中檢查子模塊

master/ 
| 
|- __init__.py 
| 
|- foo/ 
| | 
| |- __init__.py 
| 
|- bar/ 
    | 
    |- __init__.py 

現在,通常我這樣做,它適用於DEFS和變量:

import master 

unknown_submodule = "foo" 
if hasattr(master, unknown_submodule): 
    pass # all's well 

或我趕上了AttributeError異常,它的工作原理一樣。

但是,對於上述文件結構,我無法使這種方法起作用。 hasattr()總是返回False(即總是拋出AttributeError)。

如果我看dir(master),我看到這樣的輸出:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 

甚至明確規定__all__master/__init__.py沒有幫助,但改變了目錄()來

['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 

任何想法,我做錯了什麼,或者是否有辦法實現這些測試? (順便說一句:Python的2.6贏/ Cygwin的,如果這是任何權益)

回答

2

子模是不是他們的主模塊的屬性,除非明確說明。簡單地嘗試導入模塊,趕上ImportError

try: 
    __import__("os.peth", fromlist=[os]) 
except ImportError: 
    pass 
+0

你對'明確陳述'有什麼意思?我想,這就是'__all__'的作用?你有沒有碰到有用的解釋? (除了http://docs.python.org/tutorial/modules.html或http://effbot.org/zone/import-confusion.htm) 除此之外,是的'__import __()'做什麼是請求。 – Boldewyn 2010-07-13 13:15:43

+1

不,'__all__'決定了當你從'import *'說'時輸入的內容。但這與你的問題無關。如果你有一個模塊'A'和一個模塊'A.B',那麼只有當'A'本身導入'A.B'時,導入'A'纔會奇蹟般地將一個成員'B'添加到'A'。要訪問'A.B',你必須導入'A.B',而不是'A'。在'os.path'中導入'os'是可行的,因爲'os'不會主動導入'os.path'。 – Philipp 2010-07-13 13:50:57

+0

感謝您的解釋!我想我開始掌握這個問題。 – Boldewyn 2010-07-13 14:11:14

1

你可以做

try: 
import module.submodule 

except ImportError: 
    print 'failed or whatever' 
+0

是的,這樣的作品,謝謝。但是,你知道嗎?爲什麼? – Boldewyn 2010-07-13 13:16:10

+0

如果'master/__ init __。py'沒有主動地導入'master.foo',那麼'master'就沒有叫'foo'的成員。如果你只是導入'master',那麼無論'master.foo'是否存在,'master.foo'都會引發'AttributeError'。 – Philipp 2010-07-13 13:54:48