2016-07-28 21 views
0

我有一個這樣的包結構:列表包中的所有類名在python

A/__init__.py 
| 
--B/__init__.py 
| 
--C/__init__.py 

在每個包和子包,它包含了一些類,例如A/__init__.py包含A1和A2類,B/__init__.py包含B1和B2類,C/__init__.py包含C1和C2類。在A/__init__.py中,它將A及其子包的所有類名添加到__all__中。

現在,我想打印出所有包名以及它們包含的類名,例如

A包含A1,A2,B包含B1,B2,C包含C1,C2

所以給定的包A,例如的絕對路徑'xx/yy/A',如何打印上面的行?

我的問題不是關於如何檢索包的文件路徑。

+0

可能重複的[Retrieving python module path](http://stackoverflow.com/questions/247770/retrieving-python-module-path) –

+0

@WayneWerner謝謝,但你給出的鏈接與我的問題無關。 – james

回答

0

我會盡量挖掘出一些代碼,但一般:

  1. 漫步使用「os.walk」
  2. 對於每個Python包文件夾和文件的文件你會發現使用導入庫導入它。
  3. 對於每個導入的模塊,都使用「檢查」標準庫模塊中的功能來標識每個導入模塊中的類。

我沒有任何好的方法來導入基於它的絕對路徑的模塊。導入過程通過導入與現有模塊相關的路徑或相對於sys.path中的條目來工作。一個選項可能是強制將包的根目錄添加到sys.path中 - 並且爲每個找到的文件找出模塊的虛線模塊名稱。

2
print(os.path.dirname(os.path.abspath(A.__file__))) 

還是你有什麼心裏有什麼不同?

更新

如果程序包A尚未導入,我怎麼可以參考它使用A.__file__

可以說,沒有容易知道的方法。你可以通過查看import mechanism does以及後面的文件找到一個名爲A的文件夾/文件。

我只知道這個包的絕對文件夾路徑。

但是,這聽起來像你已經知道磁盤上的包的位置,並且你想要導入它,即使它沒有安裝as a package。你可以做那樣的事情,但你不應該。

+0

謝謝,但這不能回答我的問題。 – james

+0

它回答了你的*原*問題。你可能應該提出另一個問題,因爲它與你提出的問題根本不同。 –

+0

對不起,您的回答來得太快,我無法正確編輯它。但問題標題確實告訴我在找什麼。它是打包一個包下的所有類名。我想通過它的文件路徑導入這個包。 – james

相關問題