列出python中包中的所有类名

时间:2016-07-28 15:29:52

标签: 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',我该如何打印上面的一行?

  

我的问题不是如何检索包的文件路径。

2 个答案:

答案 0 :(得分:2)

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

或者你有什么不同的想法吗?

<强>更新

  

如果尚未导入包A,我如何使用A.__file__来引用它?

可以说,没有简单的方式可以知道。你可以通过查看import mechanism does的内容来找出它,然后找到一个名为A的文件夹/文件。

  

我只知道这个包的绝对文件夹路径。

但这听起来好像你已经知道磁盘上磁盘包的位置而你想要导入它,即使它没有安装as a package可以做类似的事情,但你不应该这样做。

答案 1 :(得分:0)

我会尝试挖出一些代码,但总的来说:

  1. 使用&#39; os.walk&#39;
  2. 浏览包文件夹和文件
  3. 对于您找到的每个Python文件,都使用importlib导入它。
  4. 对于每个导入的模块,使用&#39;检查&#39;中的功能。标准库模块,用于标识每个导入模块中的类。
  5. 我没有根据它的绝对路径导入模块的好方法。导入过程的工作方式是导入相对于现有模块的路径,或相对于sys.path中的条目的路径。一个选项可能是强制将包的根添加到sys.path中 - 对于您找到的每个文件,都会计算模块的虚线模块名称。