【问题标题】:How to determine the modules available in a PyPI package如何确定 PyPI 包中可用的模块
【发布时间】:2020-01-01 00:54:18
【问题描述】:

给定一个 PyPI 包名称,例如 PyYAML,如何以编程方式 确定可以导入的包(分发包)中可用的模块?

详情

我对@9​​87654330@ 并不特别感兴趣,它只是一个流行的 PyPI 包的一个很好的例子,它有一个不同的 包名 (PyYAML) 来自它的主要模块名称 (yaml) 这样你就不能轻易从包名中猜出模块名。

我见过其他听起来像这样但不同的问题的答案,可能是因为命名冲突

  • package 表示允许模块集合的 python 构造
  • package 表示“分发包”,一个存档文件 包含用于分发版本的 Python 包、模块和其他资源文件。

我的问题是关于分发包和其中的模块之间的关系。

可能的解决方案空间

看起来可能富有成果的领域(但我还没有成功)是:

  • pydoc.help 函数 (以help built-in浮出水面) 当调用help('modules') 时,输出所有可用 模块的完整列表。这 显示尚未导入但可能导入的模块。它以人类可读的形式输出 到标准输出,我一直无法弄清楚the pydoc code 枚举模块。
    • 我可以想象调用这个,收集模块列表,将一个新的分发包安装到一个 virtualenv 中 以编程方式 pip,再次调用它并比较结果。
  • 使用 pip 以编程方式安装分发包,以便
    • 遍历 python 路径的元素以查找模块

【问题讨论】:

    标签: python module setuptools pypi python-packaging


    【解决方案1】:

    我的项目johnnydep 正好提供了这个功能:

    $ johnnydep --fields=import_names PyYAML
    name    import_names
    ------  --------------
    PyYAML  yaml
    

    请注意,有些发行版导出多个顶级名称,有些发行版根本不导出,发行版名称(与pip install 命令一起使用)和包名称(与import 声明)——尽管它们是匹配的常见约定。

    例如,热门项目setuptools 公开了三个顶级名称:

    $ johnnydep --fields=import_names setuptools 
    name        import_names
    ----------  ---------------------------------------
    setuptools  easy_install, pkg_resources, setuptools
    

    API 使用是通过属性访问:

    >>> from johnnydep.lib import JohnnyDist
    >>> jdist = JohnnyDist("setuptools")
    >>> jdist.import_names
    ['easy_install', 'pkg_resources', 'setuptools']
    

    如果您有兴趣了解子模块名称,而不是顶级名称,可以使用 stdlib pkgutil,例如:

    >>> import pkgutil, requests
    >>> [name for finder, name, ispkg in pkgutil.walk_packages(requests.__path__)]
    ['__version__',
     '_internal_utils',
     'adapters',
     'api',
     'auth',
     'certs',
     'compat',
     'cookies',
     'exceptions',
     'help',
     'hooks',
     'models',
     'packages',
     'sessions',
     'status_codes',
     'structures',
     'utils']
    

    【讨论】:

    猜你喜欢
    • 2021-01-03
    • 2019-08-16
    • 2017-05-28
    • 2012-10-19
    • 1970-01-01
    • 2019-12-03
    • 2011-11-24
    • 2020-09-25
    相关资源
    最近更新 更多