パッケージ内の Python モジュールの名前をリストする標準的な方法はありますか?

StackOverflow https://stackoverflow.com/questions/487971

  •  20-08-2019
  •  | 
  •  

質問

を使用せずに、パッケージ内のすべてのモジュールの名前を一覧表示する簡単な方法はありますか? __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)])

他のヒント

使用する Python2.3以降, 、を使用することもできます pkgutil モジュール:

>>> import pkgutil
>>> [name for _, name, _ in pkgutil.iter_modules(['testpkg'])]
['modulea', 'moduleb']

編集: パラメータはモジュールのリストではなく、パスのリストであることに注意してください。そのため、次のようなことを行うとよいでしょう。

>>> import os.path, pkgutil
>>> import testpkg
>>> pkgpath = os.path.dirname(testpkg.__file__)
>>> print [name for _, name, _ in pkgutil.iter_modules([pkgpath])]
import module
help(module)

<ストライキ>私が何かを見下ろすてるかどうかを知る、または答えは日付外だけである場合はしないでください。

user815423426で述べたように、

この唯一のライブオブジェクトのために働くと記載されているモジュールが前に輸入された唯一のモジュールです。

パッケージ内のモジュールをリストに検査使用して本当に簡単そうです>
>>> import inspect, testpkg
>>> inspect.getmembers(testpkg, inspect.ismodule)
['modulea', 'moduleb']

これは、Python 3.6以上で動作する再帰的バージョンである

import importlib.util
from pathlib import Path
import os
MODULE_EXTENSIONS = '.py'

def package_contents(package_name):
    spec = importlib.util.find_spec(package_name)
    if spec is None:
        return set()

    pathname = Path(spec.origin).parent
    ret = set()
    with os.scandir(pathname) as entries:
        for entry in entries:
            if entry.name.startswith('__'):
                continue
            current = '.'.join((package_name, entry.name.partition('.')[0]))
            if entry.is_file():
                if entry.name.endswith(MODULE_EXTENSIONS):
                    ret.add(current)
            elif entry.is_dir():
                ret.add(current)
                ret |= package_contents(current)


    return ret

このモジュールをリストアップする必要があります:

help("modules")

あなたはそれのためにpydocを使用することができます(コマンドプロンプトから)のpythonコードの外にあなたのパッケージについてinforamtionを表示したい場合。

# get a full list of packages that you have installed on you machine
$ python -m pydoc modules

# get information about a specific package
$ python -m pydoc <your package>

あなたはpydocと同じ結果になりますが、ヘルプを使用してインタプリタの内部

>>> import <my package>
>>> help(<my package>)

cdlearyの例に基づいて、ここにすべてのサブモジュールのパスをリスト再帰的なバージョンがあります:

import imp, os

def iter_submodules(package):
    file, pathname, description = imp.find_module(package)
    for dirpath, _, filenames in os.walk(pathname):
        for  filename in filenames:
            if os.path.splitext(filename)[1] == ".py":
                yield os.path.join(dirpath, filename)

印刷DIR(モジュール)

def package_contents(package_name):
  package = __import__(package_name)
  return [module_name for module_name in dir(package) if not module_name.startswith("__")]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top