我意识到编译python脚本后,它修复了这个脚本的路径信息。
例如: 我有一个python脚本/tmp/src/foo.py,它有一个打印命令
print foo
现在我正在编译此代码并将其移至编译目录。
python -m compileall -f /tmp/src/foo.py
mv /tmp/src/foo.pyc /tmp/compiled/
然后我正在运行脚本,它出错了,因为我超越
python /tmp/compiled/foo.pyc
Traceback (most recent call last):
File "/tmp/src/foo.py", line 1, in <module> # focus heree
print foo
NameError: name 'foo' is not defined
正如您所知,脚本的文件名在编译之前出现错误作为其名称。 (与我给编译命令的路径完全相同)
其实我对这种情况没有问题,我问,因为我只是想知道。是什么原因,有没有办法看到错误的真实路径?
在我看来,我们无法更改二进制文件,但也许我们可以在运行已编译的代码时为python提供命令行参数,或者我们可以在源代码中添加代码段?
由于
答案 0 :(得分:1)
您的问题源于这样的概念:Python模块的编译版本可以并且应该在特定条件下移动。我以前从来没有听说过这样的事情,所以在显示批准这样的事情的规范之前,我会说这是一种滥用,你很幸运能够运行.pyc
文件所有人都没有.py
。
如果您认为.pyc
文件仅仅是原始编译版本的缓存,那么您可以轻松解释您观察到的所有现象:原始.py
文件的路径存储在.pyc
以及来自该来源的所有其他内容。如果被移动,该内容当然保持不变并将用于错误消息。
没有方法可以在错误消息中看到“真实”路径,因为加载后.pyc
文件的位置不再知道;只考虑其内容,而不考虑其位置,因为将这两个内容结合起来是编译的一个步骤。解释器不会再次编译任何已编译的模块。它需要它原样。
修补.pyc
文件以显示不同的路径似乎也没有意义,因为该消息用于帮助您调试问题。您可能不会在.pyc
文件中调试任何内容,只能在.py
文件中调试。因此,似乎应该在错误消息中包含该文件的路径。