pkgutil.iter_modules的结果不一致

时间:2016-10-25 18:11:25

标签: python

我正在尝试打印包中给定模块的所有子模块。但是,当运行该功能时,我得到了混合的结果,任何人都可以解释为什么会发生这种情况以及如何避免它?

项目布局:

/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

1 个答案:

答案 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)