cProfile 没有方法 runcall
Posted
技术标签:
【中文标题】cProfile 没有方法 runcall【英文标题】:cProfile has no method runcall 【发布时间】:2018-02-07 17:51:21 【问题描述】:我正在尝试使用 cProfile 来分析一些 python 代码。我相信我需要使用cProfile.runcall()
,而不是cProfile.run()
,因为我要运行的方法是self.funct()
的形式,而不是简单的funct()
。
当我尝试使用cProfile.runcall
,详细here时,我收到以下错误:
AttributeError: 'module' object has no attribute 'runcall'
是否已从 cProfile 中删除了 runcall 方法?如果是这样,是否有使用cProfile.runcall(self.funct,*args)
形式的替代方法?
最小(非)工作示例:
import cProfile
def funct(a):
print a
cProfile.runcall(funct,"Hello")
【问题讨论】:
我最近(艰难地)发现cProfile
模块不能与profile
模块互换。换句话说,Python 2,7 documentation 中的第一条语句,即“profile
和 cProfile
模块都提供以下功能:...”,显然是错误的 - 并且差异不是描述在任何地方(我可以找到)。
@martineau 我也想知道这个,但我发现它也不适用于profile
。
PProteus:哦,在这种情况下是你的错误。请参阅我刚刚发布的answer。
【参考方案1】:
在这种情况下,问题在于 runcall()
是 Profile
class 实例的方法,而不是模块级函数(这是您的代码尝试使用它的方式) .你需要先构造一个实例,如documentation中的代码sn-p所示。
这似乎可行(在 Python 2.7.14 中):
import cProfile
def funct(a):
print a
pr = cProfile.Profile()
pr.enable()
pr.runcall(funct, "Hello")
【讨论】:
以上是关于cProfile 没有方法 runcall的主要内容,如果未能解决你的问题,请参考以下文章
在python中将函数传递给cProfile的正确方法是啥?
将 cProfile 与 asyncio 代码一起使用的正确方法是啥?