如何在Python中显示包的子包

9

我有一个名为a的第三方库,从代码示例中我了解到它有一个子包b1,即

from a import b1

有没有可能看到a的所有子包?a包不是纯python,从文件结构上无法确定子包。我尝试了dir,但它只显示a的属性。

import a
dir(a)

这是一个开源库吗?如果是,你能分享一个链接吗? - Håken Lid
不幸的是,它是商业软件。 - nos
2个回答

7
如果软件包作者提供了软件包模块的显式索引,那么惯例是定义一个名为__all__的列表,其中包含此索引。因此,您可以执行以下操作来查看已导入软件包的所有子模块/子包(例如,根据软件包作者确定,打印所有json子模块):
import json

subs = json.__all__
print(subs)

# OUTPUT
# ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']

如果软件包作者没有提供软件包模块的索引,那么解决问题会更加困难。一种方法是使用 dir 函数,然后按类型对属性进行排序或过滤,以缩小可能是子模块/子包的集合。以下示例可能有用。

import json

def sort_by_type(t):
    return t[0].__name__

attrs = [(type(getattr(json, attr)), attr) for attr in dir(json)]
attrs.sort(key=sort_by_type)
for t, n in attrs:
    print(t, n)

# OUTPUT
# <class 'json.decoder.JSONDecoder'> _default_decoder
# <class 'json.encoder.JSONEncoder'> _default_encoder
# <class '_frozen_importlib.ModuleSpec'> __spec__
# <class '_frozen_importlib_external.SourceFileLoader'> __loader__
# <class 'dict'> __builtins__
# <class 'function'> detect_encoding
# <class 'function'> dump
# <class 'function'> dumps
# <class 'function'> load
# <class 'function'> loads
# <class 'list'> __all__
# <class 'list'> __path__
# <class 'module'> codecs
# <class 'module'> decoder
# <class 'module'> encoder
# <class 'module'> scanner
# <class 'str'> __author__
# <class 'str'> __cached__
# <class 'str'> __doc__
# <class 'str'> __file__
# <class 'str'> __name__
# <class 'str'> __package__
# <class 'str'> __version__
# <class 'type'> JSONDecodeError
# <class 'type'> JSONDecoder
# <class 'type'> JSONEncoder

很遗憾,该软件包没有定义__all__ - nos
@nos - 在这种情况下,它会相当棘手。编辑了答案,并提供了一个可能有助于您开始调查的方法。 - benvc

0

如果可用,您可以使用__all__列出Python包中包含的所有可能项。

尝试以下代码:

for i in sklearn.__all__:   
   try:
      y = eval('sklearn.{}'.format(i))
      for j in y.__all__:
      if 'package you want to find' in j.lower():
         print(i,' - ',j)   
   except:
     pass

我只得到这些错误,甚至没有输出,即使没有if语句: 异常 - 未拟合错误 异常 - 收敛警告 异常 - 数据转换警告 异常 - 数据维度警告 异常 - 效率警告 异常 - 拟合失败警告 异常 - 跳过测试警告 异常 - 未定义指标警告 异常 - 正频谱警告 - HeyMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接