2014-03-01 78 views
0

我需要獲取Python包中所有類的列表。 起初,我得到的所有文件名(它工作得很好,把它從計算器):獲取Python包中的所有類名

from os import listdir, getcwd 
from os.path import isfile, join 
mypath = os.getcwd() 
onlyfiles = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ] 

然後我檢查所有文件,它不能正常工作:

for x in onlyfiles: 
    for name, obj in inspect.getmembers(x): 
     if inspect.isclass(obj): 
      print obj 

輸出是:

<type 'str'> 
.... 
<type 'str'> 

但是,下面的代碼工作正常:

for name, obj in inspect.getmembers(example.py): 
     if inspect.isclass(obj): 
      print obj 

你能幫我弄清楚錯誤是什麼嗎?

+0

最後一塊代碼輸出是否正確? – 3Doubloons

+0

它輸出example.ClassA。如果明確地命名爲這樣的模塊inspect.getmembers(example.py)它可以工作 – Konstantin

+1

你確定在做一個'import example'後確實傳遞'example.py'而不是'example'? – 3Doubloons

回答

3

inspect.getmembers()適用於對象,並且您正在傳遞字符串。 Python不知道這些字符串包含文件名,或者將這些文件名視爲要導入的模塊。

您必須導入inspect.getmembers()的文件才能正常工作。因爲你在當前目錄下的文件工作,你應該能夠只是它們全部導入:

import importlib 

for x in onlyfiles: 
    module = importlib.import_module(x) 
    for name, obj in inspect.getmembers(module): 
     if inspect.isclass(obj): 
      print obj 

注意inspect.getmembers()接受第二個參數,可以讓你過濾方法返回什麼謂語。除了手動過濾,您可以在此僅使用inspect.isclass()作爲謂詞:

for x in onlyfiles: 
    module = importlib.import_module(x) 
    for name, obj in inspect.getmembers(module, inspect.isclass): 
     print obj 
+1

您還可以通過告訴'inspect.getmembers'通過傳遞'inspect.isclass'作爲第二個參數來進行過濾 – 3Doubloons

+0

@ 3Doubloons:確實;更新以指出。 –

+0

謝謝你的驚人答覆,我搞砸了字符串和文件名!當我有幾個子文件夾進行測試時應該做同樣的工作嗎?我擁有的是:每個文件夾中都有一些Python文件。我需要從他們的所有類名開始所有的測試。 – Konstantin

2

試試這個,使用inspect模塊:

import sys 
import inspect 

clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass) 

它運行的實時文件中。