4

私がPythonインタープリターにいて、次のように関数を定義するとします。

def h(a):
  return a

バイトコード (dis を使用した逆アセンブリではない) を見たい場合は、通常、h.func_code.co_code. バイトコードを見る他の方法はありますか?

例えばインタプリタでh、関数呼び出しにせずに打ち込むだけで、関数のアドレスを取得します。そのアドレスを使用してバイトコードを取得できますか? 他の方法はありますか?

コメントからの追加情報:

このアプリは Python で記述され、Py2App、cx_freeze、py2exe などを使用して圧縮されています。実行可能ファイルでいくつかのトリックを実行したところ、実行可能ファイルを起動すると、Python コマンド ラインが表示されます。そこから、自分の関数hをインターピーターに手動で入力しました。

、などの他の属性h.func_codeは存在しますが、存在しません。co_varnamesco_argcountco_code

h.func_code.co_codeインタープリターに入力すると、 'code' object has no attribute 'co_code'.

更新:コメントから再び。私が知る限り、オペコードはアプリに同梱されている Python インタープリター用に再マッピングされています。

4

1 に答える 1

5

独自のdef h(): passダミー関数を定義し、その関数に値がない.func_code.co_code場合、含まれているpythonインタープリターは、co_codeスロットがクリアされたカスタムコンパイル済みバージョンである可能性があります。

Contents/Resources回避策は簡単です。zipファイル(すべてのサブディレクトリ内)を他の場所にコピーし、それらをに追加しPYTHONPATHて、コードを独自のインタープリターにインポートします。

于 2012-09-20T14:28:21.010 に答える