1. ホーム
  2. python

[解決済み] パッケージ内のPythonモジュールの名前をリストアップする標準的な方法はありますか?

2022-03-09 15:20:39

質問

パッケージ内の全モジュールの名前を一覧表示する簡単な方法はありますか? __all__ ?

例えば、このようなパッケージがあった場合。

/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py

このようなことをするための標準的な、あるいはビルトインの方法はないものでしょうか。

>>> package_contents("testpkg")
['modulea', 'moduleb']

手動でのアプローチは、パッケージのディレクトリを見つけるために、モジュールの検索パスを繰り返し実行することです。 そして、そのディレクトリのすべてのファイルをリストアップし、ユニークな名前のpy/pyc/pyoファイルをフィルタリングし、拡張子を取り除き、そのリストを返します。 しかし、これはモジュールのインポート機構がすでに内部で行っていることのために、かなりの量の作業のように思えます。 その機能はどこかで公開されていますか?

解決方法は?

もしかしたら、これがあなたの探しているものになるかもしれませんよ?

import imp
import os
MODULE_EXTENSIONS = ('.py', '.pyc', '.pyo')

def package_contents(package_name):
    file, pathname, description = imp.find_module(package_name)
    if file:
        raise ImportError('Not a package: %r', package_name)
    # Use a set because some may be both source and compiled.
    return set([os.path.splitext(module)[0]
        for module in os.listdir(pathname)
        if module.endswith(MODULE_EXTENSIONS)])