【发布时间】:2018-07-30 11:11:48
【问题描述】:
问题
我有一个这样的文件夹结构:
- 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'。但不是“根”,它是子包。我也很难弄清楚如何将其转换为保留它的绝对导入风格。当前代码仅获取包/模块名称,而不是实际的绝对导入。
【问题讨论】:
-
为什么要问“没有任何第三方库”?您正在重新发明轮子(请原谅双关语),这已经由
pkg_resources(setuptools分发的一部分)实现。 -
嗯,我想学习如何做到这一点,以便我可以自定义它
-
好的,但我仍然不明白为什么排除第三方库。
-
嗯,原因是 IRC 上有人建议使用收集库,该库将@decorator 引入所有想要收集的子模块。这是收集模块名称的糟糕方法。只要模块实际上在标准库中,就应该没问题。如果代码是积极维护的第三方库(在大多数情况下不是),也应该没问题。
标签: python python-3.x python-module python-packaging