我很确定 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 中作为 main 执行的内容。暴露的代码将非常简单。
启动.py
import foo
foo.call_my_func()
然后运行:
python -m cProfile -o ./temp/PROFILE.log launch.py