问题
我有一个这样的文件夹结构:
- 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/