我正在尝试打印包中给定模块的所有子模块。但是,当运行该功能时,我得到了混合的结果,任何人都可以解释为什么会发生这种情况以及如何避免它?
项目布局:
/Users/me/projects/project
setup.py
/project
__init__.py
tool.py
/projectdir
__init__.py
test.py
/Users/me/projects/project/project/tool.py:
import pkgutil
for importer, modname, ispkg in \
pkgutil.iter_modules('project.projectdir',
prefix='project.projectdir.'):
if not ispkg:
print '{}'.format(modname)
/Users/me/projects/project/project/projectdir/test.py
def one():
return 'one'
理想情况下,这应该打印出/projectdir
内的所有模块,但是我得到了混合结果。
这是对的:
$ cd /Users/me
$ project
>> project.projectdir.test
这些都是错的:
$ cd /Users/me/projects
$ project
>>
$ cd /Users/me/projects/project
$ project
>> project.projectdir.one
答案 0 :(得分:1)
使用.__path__
可以避免迭代的相对路径。在您的示例中,您将传递project.projectdir.
。
/Users/me/projects/project
import pkgutil
# import module that will be inspected
import project
package = project
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix='project.projectdir.'):
if not ispkg:
print '{}'.format(modname)