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

本文介绍了一种方法来查找并打印Python模块及其子模块中的所有子模块,旨在解决在游戏环境中注入代码并获取模块结构的问题。通过导入模块并使用`dir()`函数,结合递归,可以列出模块的子模块。然而,遇到的问题是当尝试访问模块的属性时,如果这些属性不是实际的子模块,会导致错误。示例代码展示了如何遍历模块和其子模块,但不包括模块中的函数和其他元素。
摘要由CSDN通过智能技术生成

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

import modulename

print dir(modulename)

然后打印目录(modulename.submodulename)

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

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"是一个实模块,但第二个"."之后的任何内容都不在随机子模块中。

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

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

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

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

也许我弄错了你的要求,不管怎样,你可以用__name__属性得到模块名,你可以用'.'.join(["package","subpackage","module"])把一个数量可变的字段与点连接起来。

我试试这个,谢谢。如果我有机会,我会回复的:)

你的意思是这样吗?"对于目录中的b(".".join([modulename,a]):

是的,这不起作用"traceback(most recent c all last):file"c:usersfresholliedocumentspython(computing)find all directories.py",line 7,inh=".join([random,a])typeerror:sequence item 0:expected string,module found"

您可以得到具有__name__属性的子模块(已经有点)的名称:a.__name__ -> modulename.a。

@巴库鲁,我打赌你知道该怎么做,但不能把这个传达给我,我是一个编程的笨蛋,我仍然不明白我能用这个做什么:(。你能把它写进我的代码中,给我一个我可以在哪里使用它的例子吗?非常感谢。

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]))

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

我会试试的,谢谢。

我应该在哪里使用它,如果我尝试在其中输入一个模块,它会给出">>>list_modules(random)traceback(most recent call last):file"",line 1,inlist_modules(random)file"c:/users/freshollie/documents/python(computing)/test.py",line 6,in list_modules module=uuu import_uuu(module name,globals(),locals(),[module_name.split('.')[-1]])attributeError:'module'对象没有属性'split'"

module_name是一个字符串,尝试用list_modules('random')代替(虽然random没有子模块,所以它不会很有趣)。

我会试试的

非常感谢,这看起来工作得很好-但我发现它没有列出所有的功能。如果我用这个注射器。list_modules("base")没有任何结果,即使我做了print dir(base),它也有数百种可能的用途。埃多克斯1〔5〕

你的问题似乎意味着你只想找到子模块。例如,您还可以检查types.FunctionType和types.LambdaType类型的对象(显然不需要递归调用list_modules)。不过,您现在的处境更为模糊——是否也要打印出类及其方法?等。

是的,对不起,我真的不知道我在说什么,是吗?我对这类东西不是很有经验,所以我不知道如何描述我想要的东西。如果你认为这是我要找的,那么它可能是正确的,有没有这样做?

虽然dir()并不总是显示所有模块,但这段代码工作得很好。我通过首先加载所有模块使dir()工作得更好:stackoverflow.com/questions/1057431/…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值