Python堆栈跟踪中绝对路径和相对路径的含义

8 投票
1 回答
1037 浏览
提问于 2025-04-17 19:16

我运行了 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
  ...

现在,我无法重现这个效果,但我还是很好奇有没有人知道可能发生了什么。

1 个回答

1

总的来说,Python在理解文件名时是很透明的。

每当Python执行一个import操作时,它会查看一个叫做PYTHONPATH的环境变量,这个变量会设置Python的一个叫做sys.path的变量。

sys.path中的路径可以是绝对路径,也可以是相对路径。一个常见的相对路径是.,它代表当前的工作目录。

如果在执行导入时,sys.path中找到的路径是相对路径,那么在错误追踪信息中显示的文件名也会是相对的。我还认为,如果一个Python程序使用了relative import(相对导入),那么显示的文件名也是相对的。

撰写回答