Разница между простым вызовом функции Python и переносом его в cProfile.run () - PullRequest
3 голосов
/ 11 августа 2010

У меня довольно простой скрипт на Python, который содержит вызов функции, такой как

f(var, other_var)

, то есть функция, которая получает несколько параметров.Все эти параметры доступны в пределах f и имеют значения.

Когда я вместо этого вызываю

cProfile.run('f(var, other_var)')

, происходит сбой с сообщением об ошибке:

NameError: "name 'var' is not defined"

Версия Python

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

Что здесь происходит?

1 Ответ

9 голосов
/ 11 августа 2010

Это потому, что cProfile пытается exec код, который вы передаете в виде строки, и завершается неудачей, потому что, ну, var не определено в этом фрагменте кода! Он использует переменные в рамках вызова run(), но, поскольку вы не сообщили о них cProfile, он не знает, как их использовать. Вместо этого используйте runctx, поскольку он позволяет передавать локальные и глобальные словари для использования в exec ed-коде:

cProfile.runctx( "...", globals(), locals() )
...