试图在python中打印模块内的每个子模块

时间:2012-10-12 16:24:20

标签: python module finder

对不起,如果我在这期间弄错了一些事实,但我只编程了大约一年,因为我在我的学校开了一个计算机课程,对不起,如果这个问题在我到处看之前已经得到了回答,但我不知道我知道要搜索什么。最近我发现了一个游戏,您可以使用注入器将python代码注入其中,但找到代码的唯一方法是使用:

    import modulename
    print dir(modulename)

然后         print dir(modulename.submodulename)

将该模块中的所有子模块打印到游戏的日志文件中。使用这种技术,我开发了一个脚本,在执行时将找到该目录中的所有子模块并将它们写入文件。

import modulename

myfile=open("name.txt","w")
myfile.write("modulename\n")

for a in dir(modulename):
    a="modulename"+"."+a
    for b in dir(a):
        b=a+"."+b
        for c in dir(b):
            c=b+"."+c
            if ".__" in c:
                pass
            elif "._" in c:
                pass
            else:
                myfile.write(c+"\n")
        if ".__" in b:
            pass
        if "._" in b:
            pass
        else:
            myfile.write(b+"\n")
    if ".__" in a:
        pass
    if "._" in a:
        pass
    else:
        myfile.write(a+"\n")

print "Done"
myfile.close()

不幸的是,当运行“something.something”时,模块不存在。这是模块“随机”的示例,其中“random.weibullvariate”是一个真实的模块,但是经过第二个“。”的任何东西。不在随机子模块中。

random.weibullvariate.title.translate
random.weibullvariate.title.upper
random.weibullvariate.title.zfill
random.weibullvariate.title
random.weibullvariate.translate.capitalize
random.weibullvariate.translate.center
random.weibullvariate.translate.count
random.weibullvariate.translate.decode
random.weibullvariate.translate.encode
random.weibullvariate.translate.endswith
random.weibullvariate.translate.expandtabs
random.weibullvariate.translate.find
random.weibullvariate.translate.format
random.weibullvariate.translate.index
random.weibullvariate.translate.isalnum
random.weibullvariate.translate.isalpha
random.weibullvariate.translate.isdigit
random.weibullvariate.translate.islower
random.weibullvariate.translate.isspace
random.weibullvariate.translate.istitle
random.weibullvariate.translate.isupper
random.weibullvariate.translate.join
random.weibullvariate.translate.ljust
random.weibullvariate.translate.lower
random.weibullvariate.translate.lstrip
random.weibullvariate.translate.partition
random.weibullvariate.translate.replace
random.weibullvariate.translate.rfind
random.weibullvariate.translate.rindex
random.weibullvariate.translate.rjust
random.weibullvariate.translate.rpartition
random.weibullvariate.translate.rsplit
random.weibullvariate.translate.rstrip
random.weibullvariate.translate.split
random.weibullvariate.translate.splitlines
random.weibullvariate.translate.startswith
random.weibullvariate.translate

正如您所看到的那样,存在“随机”中不存在的子模块。 我最终解决了问题所在,但我没有足够的经验来解决问题。

问题在于使用前两行作为示例

for a in dir(modulename):
    a="module name"+"."+a
如果我这样做的话         一个         “modulename.submodule” 你可以看到“a”是一个字符串,如果我然后将“a”放入“dir()”中,那么无论子模块名称是什么,都会返回相同的内容。

我需要找到一种方法,用“。”将子模块添加到以前的模块名称中。在两者之间没有把它变成一个字符串。

很抱歉这篇长篇文章,有人有任何想法吗?

1 个答案:

答案 0 :(得分:4)

import types

def list_modules(module_name):
    try:
        module = __import__(module_name, globals(), locals(), [module_name.split('.')[-1]])
    except ImportError:
        return
    print(module_name)
    for name in dir(module):
        if type(getattr(module, name)) == types.ModuleType:
            list_modules('.'.join([module_name, name]))

不能声称这适用于所有情况,但值得一试吗?