很抱歉,如果我在这段时间里发现了一些错误的事实,但自从我在学校上了一门计算机课程以来,我只做了大约一年的编程工作。很抱歉,如果这个问题在我到处找之前就已经被回答了,但我不知道该搜索什么。最近我发现了一个可以使用注入器将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/…