【问题标题】:Trying to print every submodule inside a module in python尝试在python中打印模块内的每个子模块
【发布时间】:2012-10-12 16:24:19
【问题描述】:

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

    import modulename
    print dir(modulename)

然后 打印目录(模块名.子模块名)

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

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

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

我需要找到一种方法将子模块添加到带有“。”的先前模块名称中。中间没有把它变成一个字符串。

抱歉,帖子太长了,有人有什么想法吗?

【问题讨论】:

  • 可能我问错了,无论如何您可以使用__name__ 属性获取模块名称,并且您可以使用'.'.join(["package", "subpackage", "module"]) 将可变数量的字段与点连接起来。
  • 我会试试这个,谢谢。如果我有任何地方我会回复:)
  • 你的意思是这样吗? "for b in dir(".".join([modulename,a])):"
  • 是的,这不起作用“追溯(最近一次调用最后一次):文件“C:\Users\FreshOllie\Documents\Python(计算)\查找所有目录.py”,第 7 行,在 h=".".join([random,a]) TypeError: sequence item 0: expected string, module found"
  • 您可以使用__name__ 属性获取子模块的名称(已经带有点):a.__name__ -> modulename.a

标签: python module finder


【解决方案1】:
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(最近一次调用最后一次):文件“ ",第 1 行,在 list_modules(random) 文件中 "C:/Users/FreshOllie/Documents/Python (Computing)/test.py",第 6 行,在 list_modules module = __import__(module_name, globals(), locals (), [module_name.split('.')[-1]]) AttributeError: 'module' 对象没有属性 'split'"
  • module_name 是一个字符串,尝试使用list_modules('random') 代替(虽然random 没有子模块,所以它不会很有趣)。
  • 非常感谢这似乎工作得很好 - 但我发现它没有列出所有的功能。如果我使用这个注射器。 list_modules("base") 它什么也没有,即使我这样做 print dir(base) 它也有数百种可能的用途。 'autoPlayAgain', 'backfaceCullingEnabled', 'backfaceCullingOff', 'backfaceCullingOn', 'backgroundDrawable', 'bboard', 'bottomCells', 'bufferViewer', 'buttonThrowers', 'cTrav', 'cTravStack', 'cam', 'cam2d', 'cam2dp', 'camFrustumVis', 'camLens', 'camList', 'camNode', 'camera', 'camera2d', 'camera2dp', 'canScreenShot', 'cannonsEnabled'
  • 您的问题似乎暗示您只想查找子模块。例如,您还可以检查 types.FunctionTypetypes.LambdaType 类型的对象(显然没有在这些对象上递归调用 list_modules)。但是,您在这里遇到了一个更加模棱两可的情况——您是否也想打印出类及其方法?等
  • 是的,抱歉,我真的不知道我在说什么,是吗?我对这种类型的东西不是很有经验,所以我不知道如何描述我想要的东西。如果您认为这就是我正在寻找的东西,那么它可能是正确的,有没有这样做?
猜你喜欢
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多