我运行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
...
现在,我无法重现效果,但如果有人知道可能发生了什么,我仍然很好奇。
答案 0 :(得分:1)
一般来说,Python对于如何理解文件名是透明的。
每当Python执行import
时,都会查询环境变量PYTHONPATH
并设置Python变量sys.path
。
sys.path
中的路径组件可以是绝对的也可以是相对的。常用的相对路径名是.
(当前工作目录)。
如果在执行导入时,sys.path
中找到的名称基于相对路径,则堆栈跟踪中显示的文件名也将是相对的。我还认为,如果Python程序使用relative import,那么它也会显示为相对文件名。