inspect.getsourcelines(object)如果从pythonshell运行,则显示OSError;如果从fi运行,则不显示错误

2024-04-25 23:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个名为test.py的脚本中尝试了这段代码:

from inspect import *

def f1(p,r):
    """Return f1 score from p,r"""
    return 2*p*r/(p+r)

print(getsourcelines(f1))

如果我使用python3 test.py从终端运行此命令,它将输出以下内容:

^{pr2}$

但是,如果我在pythonshell中逐行运行相同的整个脚本,它会抛出一个OSError。这是我在python shell中尝试的,同时出现错误:

>>> from inspect import *
>>> 
>>> def f1(p,r):
...     """Return f1 score from p,r"""
...     return 2*p*r/(p+r)
... 
>>> print(getsourcelines(f1))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/inspect.py", line 955, in getsourcelines
    lines, lnum = findsource(object)
  File "/usr/lib/python3.6/inspect.py", line 786, in findsource
    raise OSError('could not get source code')
OSError: could not get source code
>>> 

为什么inspect.getsourcelines(f1)在pythonshell中抛出错误,但在从文件运行时却不抛出错误?有没有其他方法可以获取在pythonshell中声明的函数的源代码行?在


Tags: infrompytestimport脚本def错误
1条回答
网友
1楼 · 发布于 2024-04-25 23:25:12

这是预期的行为。inspect对内置对象的支持有限(不从文件加载)。在

它在其他函数中是显式的,比如getsourcefile,其中doc说:

This will fail with a TypeError if the object is a built-in module, class, or function.

如果不太明确,getsourcelines的文档显示(强调我的):

The source code is returned as a list of the lines corresponding to the object and the line number indicates where in the original source file the first line of code was found. An OSError is raised if the source code cannot be retrieved.

在当前版本中,getsourcelines尝试在当前源文件中定位函数。由于它无法获取在文件外部声明的函数的当前源文件,因此会引发异常。在

根本原因是,当python以交互模式启动时,主模块是一个内置模块,没有__file__属性。在

相关问题 更多 >