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

Trying to print every submodule inside a module in python

很抱歉,如果我在这段时间里发现了一些错误的事实,但自从我在学校上了一门计算机课程以来,我只做了大约一年的编程工作。很抱歉,如果这个问题在我到处找之前就已经被回答了,但我不知道该搜索什么。最近我发现了一个可以使用注入器将python代码注入其中的游戏,但唯一找到代码的方法是使用:

1
2
    import modulename
    print dir(modulename)

然后打印目录(modulename.submodulename)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import modulename

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

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+"
"
)
        if".__" in b:
            pass
        if"._" in b:
            pass
        else:
            myfile.write(b+"
"
)
    if".__" in a:
        pass
    if"._" in a:
        pass
    else:
        myfile.write(a+"
"
)

print"Done"
myfile.close()

不幸的是,当运行超过"something.something"时,模块不存在。这里是"random"模块的一个示例,其中"random.weibulvariate"是一个实模块,但第二个"."之后的任何内容都不在随机子模块中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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

正如你所看到的,在"随机"中有一些子模块是不存在的。我最终找出了问题所在,但我的经验不足,无法解决问题。

问题是,以前两行为例

1
2
for a in dir(modulename):
    a="module name"+"."+a

如果我做了一"模块名.子模块"如您所见,"a"是一个字符串,如果我将"a"放入"dir()"中,那么无论子模块的名称是什么,都会返回相同的内容。

我需要找到一种方法将子模块添加到前面的模块名中,中间加一个".",而不将其转换为字符串。

抱歉,这么长的帖子,有人有什么想法吗?


1
2
3
4
5
6
7
8
9
10
11
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]))

难道不能说这对所有情况都有效,但值得一试吗?