1

私は Python の初心者で、コマンド ラインから cProfile を呼び出そうとしています。

python -m cProfile -o ./temp/PROFILE.log myScript.pyo

しかし、それはそれを示すエラーメッセージをスローします

SyntaxError: ファイル myScript.pyo の 1 行目に非 ASCII 文字 '\xb3' がありますが、エンコードが宣言されていません。詳細については、 http://www.python.org/peps/pep-0263.htmlを参照してください。

しかし、myScript.py ファイルに対して同じことを行うと、問題なく動作します。

クライアント マシンでプロファイル データを収集する必要があり、そのマシンにソース コードを配置できません。

足りないものはありますか?

4

1 に答える 1

1

cProfile が execfile() を利用していると確信しています。ヒントはドキュメント ( http://docs.python.org/library/profile.html )から得られます。

この関数は、 exec ステートメントに渡すことができる単一の引数を取ります

execfile() は *.pyc および *.pyo ファイルを実行できません - 同じ例外で失敗します。

>>> execfile("myscript.pyc")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "tix_email.pyc", line 1
SyntaxError: Non-ASCII character '\xd1' in file tix_email.pyc on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

.pyc または .pyo に対して profile/cProfile を実行するユース ケースは、おそらく対処されていません。その理由についての標準的な説明は見つかりませんでしたが、cPython インタープリターの動作方法のために、メイン スクリプトは通常、バイト コンパイルされないと予想されます。インタープリターは、メイン スクリプトを自動的にバイト コンパイルしませんが、インポートされたモジュールに対しては行います。トピックに関する SO の質問は次のとおりです。なぜ Python はモジュールをコンパイルするのに、実行されているスクリプトはコンパイルしないのですか?

問題を回避するには、起動スクリプトを使用して、プロファイリングする .pyo で通常メインとして実行するものを呼び出すことができます。公開されたコードは非常に簡単です。

launch.py

import foo
foo.call_my_func()

そして実行します:

python -m cProfile -o ./temp/PROFILE.log launch.py

于 2011-07-05T21:24:19.890 に答える