6

この間に事実が間違っていたら申し訳ありませんが、学校でコンピューティングのコースを始めてから約 1 年しかプログラミングをしていません。検索する。最近、インジェクターを使用して Python コードをインジェクトでき​​るゲームを見つけましたが、コードを見つける唯一の方法は次を使用することです。

    import modulename
    print dir(modulename)

そして 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」は実際のモジュールですが、2 番目以降の「.」はすべてです。ランダムサブモジュールにはありません。

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

ご覧のとおり、「ランダム」には存在しないサブモジュールが配置されています。問題が何であるかを突き止めましたが、問題を解決するのに十分な経験がありません。

問題は、最初の 2 行を例として使用することです。

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

「modulename.submodule」を実行した場合 ご覧のとおり、「a」は文字列であり、「a」を「dir()」に入れると、サブモジュールの名前に関係なく同じものが返されます。

「。」を使用して、前のモジュール名にサブモジュールを追加する方法を見つける必要があります。それを文字列に変えずに間に入れます。

長文失礼しました、何かいいアイデアありませんか?

4

1 に答える 1

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

これがすべてのケースで機能するとは言えませんが、試してみる価値はありますか?

于 2012-10-12T17:03:38.037 に答える