1

Python モジュールをバイトコードに逆アセンブルして実験しています。

逆アセンブルまたは検査するために、Python モジュールを静的または動的にインポートする必要がありますか? そうでない場合、それを行う(pythonic、ポータブル)方法は何ですか?

そうしたいです:

  1. 実行時に利用可能な Python モジュールのバイナリ データをメモリに読み込みます。
    1. で使用可能なモジュールとして表示されませんsys.modules
    2. __init__モジュールのコード を実行したり、名前空間に追加したりしたくありません。
    3. モジュールをロードすることによるその他の副作用はありません。インタプリタに関する限り、それは検査対象のデータの塊であるべきです。
  2. モジュールのクラス、関数、またはデータを逆アセンブルまたは検査します。
  3. 必要に応じてモジュールをアンロードします。

__init__検索したところ、動的モジュールのインポート (モジュールコードまたは他のインライン コードの実行、および sys.modules への挿入という副作用があります) の方法がいくつか見られます。しかし、私はむしろそれらの副作用に対処したくありません.

これは可能ですか?もしそうなら、どのアプローチが最も移植性/Pythonicですか?

4

2 に答える 2

1

これを少し調べたところ、考えられる解決策の 1 つはpyclbrモジュールの使用です。検査では、クラスと関数に関する基本情報を調べ、簡単にアクセスできるように辞書にロードします。実行例は次のとおりです。

>>> import pyclbr
>>> import sys
>>> info = pyclbr.readmodule_ex('inspect')
>>> info
{'formatargvalues': <pyclbr.Function object at 0x5083e28e50>, 'walktree': <pyclbr.Function object at 0x5083e28b50>, 'getinnerframes': <pyclbr.Function object at 0x5083e29050>, 'indentsize': <pyclbr.Function object at 0x5083e28710>, 'getmodulename': <pyclbr.Function object at 0x5083e28850>, 'formatannotation': <pyclbr.Function object at 0x5083e28d50>, 'ismemberdescriptor': <pyclbr.Function object at 0x5083e283d0>, 'iscode': <pyclbr.Function object at 0x5083e28550>, 'getsource': <pyclbr.Function object at 0x5083e28b10>, 'formatargspec': <pyclbr.Function object at 0x5083e28dd0>, 'getabsfile': <pyclbr.Function object at 0x5083e288d0>, 'getsourcelines': <pyclbr.Function object at 0x5083e28ad0>, '_getfullargs': <pyclbr.Function object at 0x5083e28c10>, 'isabstract': <pyclbr.Function object at 0x5083e28610>, 'isbuiltin': <pyclbr.Function object at 0x5083e28590>, 'getlineno': <pyclbr.Function object at 0x5083e28f10>, 'getcomments': <pyclbr.Function object at 0x5083e28990>, 'getgeneratorstate': <pyclbr.Function object at 0x5083e293d0>, 'getattr_static': <pyclbr.Function object at 0x5083e29390>, 'getframeinfo': <pyclbr.Function object at 0x5083e28ed0>, 'isgenerator': <pyclbr.Function object at 0x5083e28490>, '_static_getmro': <pyclbr.Function object at 0x5083e29190>, 'isframe': <pyclbr.Function object at 0x5083e28510>, 'getouterframes': <pyclbr.Function object at 0x5083e28f90>, 'getclasstree': <pyclbr.Function object at 0x5083e28b90>, 'getfile': <pyclbr.Function object at 0x5083e287d0>, '_shadowed_dict': <pyclbr.Function object at 0x5083e29310>, 'getargvalues': <pyclbr.Function object at 0x5083e28d10>, 'getmembers': <pyclbr.Function object at 0x5083e28650>, 'BlockFinder': <pyclbr.Class object at 0x5083e28a10>, 'isfunction': <pyclbr.Function object at 0x5083e28390>, 'getargspec': <pyclbr.Function object at 0x5083e28c50>, 'currentframe': <pyclbr.Function object at 0x5083e29090>, 'namedtuple': <pyclbr.Function object at 0x5083e1b150>, 'getmoduleinfo': <pyclbr.Function object at 0x5083e28810>, 'trace': <pyclbr.Function object at 0x5083e29110>, 'isclass': <pyclbr.Function object at 0x5083db8950>, '_is_type': <pyclbr.Function object at 0x5083e29290>, 'getcallargs': <pyclbr.Function object at 0x5083e28e90>, 'ismethoddescriptor': <pyclbr.Function object at 0x5083e28310>, 'isgeneratorfunction': <pyclbr.Function object at 0x5083e28450>, 'isroutine': <pyclbr.Function object at 0x5083e285d0>, 'getfullargspec': <pyclbr.Function object at 0x5083e28cd0>, 'getmro': <pyclbr.Function object at 0x5083e286d0>, 'getargs': <pyclbr.Function object at 0x5083e28bd0>, 'stack': <pyclbr.Function object at 0x5083e290d0>, 'getdoc': <pyclbr.Function object at 0x5083e28750>, 'findsource': <pyclbr.Function object at 0x5083e28950>, 'cleandoc': <pyclbr.Function object at 0x5083e28790>, '_check_class': <pyclbr.Function object at 0x5083e29250>, '_check_instance': <pyclbr.Function object at 0x5083e29210>, 'classify_class_attrs': <pyclbr.Function object at 0x5083e28690>, 'ismodule': <pyclbr.Function object at 0x5083db8910>, 'EndOfBlock': <pyclbr.Class object at 0x5083e289d0>, 'isdatadescriptor': <pyclbr.Function object at 0x5083e28350>, 'getmodule': <pyclbr.Function object at 0x5083e28910>, 'formatannotationrelativeto': <pyclbr.Function object at 0x5083e28d90>, 'getsourcefile': <pyclbr.Function object at 0x5083e28890>, 'ismethod': <pyclbr.Function object at 0x5083e282d0>, 'isgetsetdescriptor': <pyclbr.Function object at 0x5083e28410>, 'istraceback': <pyclbr.Function object at 0x5083e284d0>, 'getblock': <pyclbr.Function object at 0x5083e28a50>}
>>> sys.modules['inspect']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'inspect'

より高度なものは、 ast モジュールを介して抽象構文ツリーにアクセスすることを検討し始める必要があります。

于 2013-03-05T02:35:39.257 に答える
0

ソースファイルをロードしてバイトコードにコンパイルし、モジュールをロードしてモジュールをインポートせず にバイトコードにコンパイルする関数を含む、Python 2.7 のuncompyle2を見つけました。

したがって、少なくとも実行可能であるように見えますがcompile()、ソースでの呼び出しが必要になるか、または pyc ファイルを操作する場合は移植できない可能性があります (uncompyle2 は pyc ファイルでのみ Python 2.7 をサポートします)。

于 2013-03-05T05:11:02.493 に答える