我发现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 提供命令行参数,或者我们可以向源代码添加代码段?
最佳答案
您的问题源自这样的概念:Python 模块的编译版本可以而且应该在某些条件下移动。实际上我以前从未听说过这样的事情,所以在显示批准这样的事情的规范之前,我想说这是一种滥用,你很幸运能够运行 .pyc
文件根本没有 .py
位于其旁边。
如果您将 .pyc
文件视为原始文件编译版本的缓存,那么您可以轻松解释您观察到的所有现象:原始 .py< 的路径
文件与来自该源的其他所有内容一起存储在 .pyc
中。如果移动,该内容当然会保持不变,并将在错误消息中使用。
无法在错误消息中查看“真实”路径,因为加载后 .pyc
文件的位置不再可知;仅考虑其内容,而不考虑其位置,因为将这两件事结合起来是编译的一个步骤。解释器不会再次将任何内容编译到已编译的模块中。它就这样。
修补 .pyc
文件以显示不同的路径似乎也没有意义,因为该消息是为了帮助您调试问题。您可能不会调试 .pyc
文件中的任何内容,而只会调试 .py
文件中的内容。因此,在错误消息中包含该文件的路径似乎更合适。
关于Python脚本路径编译后保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495289/