python堆栈跟踪中绝对/相对路径的含义



我运行top_level_script.py,得到一个异常,堆栈跟踪如下:

File "top_level_script.py", line 114, in main
  …
File "top_level_script.py", line 91, in func1
  ...
File "top_level_script.py", line 68, in func2
  **kwargs)
File "/home/max/.../cccc/ffff/mmmm.py", line 69, in some_func
  obj = SomeClass(…)
File "mmm/ttt/bbb/core.py", line 17, in __init__
File "/home/max/.../pppp/pppp.py", line 474, in func
  ...
File "/home/max/.../pppp/pppp.py", line 355, in some_func
  ...

注意mmm/ttt/bbb/core.py有一个相对路径,而它上面和下面的帧有绝对路径。此外,在__init__中没有打印出第17行,并且被调用的代码是"旧的"。我刚改了,但旧代码被调用了。因此出现了例外。

我仍然发现Python的导入机制有时令人困惑。谁能解释一下core.py是怎么回事,如果有的话,在那个框架中显示的相对路径的意义是什么?

经过一些修改后,我的假设是python以某种方式调用了.pyc(因此在下面的行中没有显示源代码)。在修改文件(即修改并保存它)之后,我现在得到:

File "top_level_script.py", line 114, in main
  …
File "top_level_script.py", line 91, in func1
  ...
File "top_level_script.py", line 68, in func2
  **kwargs)
File "/home/max/.../cccc/ffff/mmmm.py", line 69, in some_func
  obj = SomeClass(…)
File "/home/max/.../mmm/ttt/bbb/core.py", line 17, in __init__
  ...
File "/home/max/.../pppp/pppp.py", line 474, in func
  ...
File "/home/max/.../pppp/pppp.py", line 355, in some_func
  ...

现在,我不能复制效果,但我仍然好奇是否有人知道可能发生了什么。

一般来说,Python对文件名的理解是透明的。

当Python执行import时,会参考环境变量PYTHONPATH,并设置Python变量sys.path

sys.path中的路径分量可以是绝对的也可以是相对的。常见的相对路径名是.(当前工作目录)。

如果在执行导入时,在sys.path中找到的名称是基于相对路径的,那么出现在堆栈跟踪中的文件名也将是相对的。我还认为,如果Python程序使用相对导入,那么它也会显示为相对文件名。

最新更新