1

我是 Python 的初学者,并试图通过命令行调用 cProfile,即

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

但它会抛出一条错误消息,指出

SyntaxError:第 1 行文件 myScript.pyo 中的非 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 中作为 main 执行的内容。暴露的代码将非常简单。

启动.py

import foo
foo.call_my_func()

然后运行:

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

于 2011-07-05T21:24:19.890 回答