python - 如何递归获取 python 包中的所有子模块?

标签 python python-3.x python-module python-packaging

问题

我有一个这样的文件夹结构:

- modules
    - root
        - abc
            hello.py
            __init__.py
        - xyz
            hi.py
            __init__.py
          blah.py
          __init__.py
      foo.py
      bar.py
      __init_.py

这是字符串格式的相同内容:
"modules",
"modues/__init__.py",
"modules/foo.py",
"modules/bar.py",
"modules/root",
"modules/root/__init__.py",
"modules/root/blah,py",
"modules/root/abc",
"modules/root/abc/__init__.py",
"modules/root/abc/hello.py",
"modules/root/xyz",
"modules/root/xyz/__init__.py",
"modules/root/xyz/hi.py"

我正在尝试以 python 导入样式格式打印出所有模块。
示例输出如下所示:
modules.foo
modules.bar
modules.root.blah
modules.root.abc.hello
modules.root.xyz.hi

我怎么能在python中轻松做到这一点(如果可能没有第三方库)?

我试过的

示例代码

import pkgutil

import modules

absolute_modules = []


def find_modules(module_path):
    for package in pkgutil.walk_packages(module_path):
        print(package)
        if package.ispkg:
            find_modules([package.name])
        else:
            absolute_modules.append(package.name)


if __name__ == "__main__":
    find_modules(modules.__path__)
    for module in absolute_modules:
        print(module)

但是,此代码只会打印出 'foo' 和 'bar'。但不是“根”,它是子包。我也很难弄清楚如何将其转换为保留它的绝对导入风格。当前代码仅获取包/模块名称,而不是实际的绝对导入。

最佳答案

这使用 setuptools.find_packages (对于包裹)和 pkgutil.iter_modules 对于他们的子模块。也支持 Python2。不需要递归,全部由这两个函数一起使用来处理。

import sys
from setuptools import find_packages
from pkgutil import iter_modules

def find_modules(path):
    modules = set()
    for pkg in find_packages(path):
        modules.add(pkg)
        pkgpath = path + '/' + pkg.replace('.', '/')
        if sys.version_info.major == 2 or (sys.version_info.major == 3 and sys.version_info.minor < 6):
            for _, name, ispkg in iter_modules([pkgpath]):
                if not ispkg:
                    modules.add(pkg + '.' + name)
        else:
            for info in iter_modules([pkgpath]):
                if not info.ispkg:
                    modules.add(pkg + '.' + info.name)
    return modules

关于python - 如何递归获取 python 包中的所有子模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48879353/

相关文章:

python - lxml 基本上什么都没有

python - 如何通过管道将 HEREDOC 传输到头部?

python-3.x - 使用 python + selenium 模拟谷歌搜索的控制台应用程序

Python Flask - 重定向到带有查询结果的同一页面

python - 如何在 Python 中设置模块的文件名,以便模块中发生的异常使用该文件名?

带有自动加载表的 Python-Sqlalchemy 二进制列类型 HEX() 和 UNHEX()

python-3.x - ctypes 对象位于非常相似的内存地址

python - 如何访问 Python 的帮助 ('modules' ) 显示的模块列表?

python - "raw string regex"究竟是什么,你如何使用它?

python - 仅从 JSON 文件中删除引号内的标点符号