Python cProfile: возможно ли для файла pyo - PullRequest
0 голосов
/ 05 июля 2011

Я новичок в Python и пытаюсь вызвать cProfile через командную строку, т.е.

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

Но выдается сообщение об ошибке, в котором говорится, что

SyntaxError: не-ASCII символ '\ xb3'в файле myScript.pyo в строке 1, но кодировка не объявлена;см. http://www.python.org/peps/pep-0263.html для подробностей

Но если я сделаю то же самое для файла myScript.py, он будет работать нормально.

Мне нужно собрать данные профиля на клиентском компьютере, и на нем не может быть исходного кода.

Что-то мне не хватает?

1 Ответ

1 голос
/ 06 июля 2011

Я почти уверен, что 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

Сценарий использования profile / cProfile для .pyc или .pyo, вероятно, просто никогда не рассматривался. Я не нашел канонического объяснения, почему это так, но обычно ожидается, что основные сценарии не будут скомпилированы байтами из-за способа работы интерпретатора cPython. Интерпретатор не будет автоматически компилировать байты основных сценариев, но будет делать это для импортированных модулей. Вот SO вопрос по теме: Почему Python компилирует модули, но не запускает скрипт?

Чтобы обойти вашу проблему, у вас могут быть сценарии запуска для вызова того, что вы обычно выполняете в качестве основного в .pyo, который вы хотели бы профилировать. Открытый код будет довольно тривиальным.

launch.py ​​

import foo
foo.call_my_func()

А затем запустить:

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

...