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

Max*_*Max 8 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
  ...
Run Code Online (Sandbox Code Playgroud)

请注意,它mmm/ttt/bbb/core.py具有相对路径,而其上方和下方的帧具有绝对路径.此外,第17行中没有打印__init__,并且被调用的代码是"旧".我只是改变了它,但旧代码被调用了.因此例外.

我仍然发现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
  ...
Run Code Online (Sandbox Code Playgroud)

现在,我无法重现这种效果,但如果有人知道可能发生了什么,我仍然很好奇.

roc*_*cky 1

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

每当 Python 执行时import,都会查阅环境变量PYTHONPATH并设置 Python 变量sys.path

路径组件sys.path可以是绝对的或相对的。常见的相对路径名是.(当前工作目录)。

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