编译后python脚本路径保持不变

时间:2013-12-10 13:00:56

标签: python compiler-construction path compilation

我意识到编译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提供命令行参数,或者我们可以在源代码中添加代码段?

由于

1 个答案:

答案 0 :(得分:1)

您的问题源于这样的概念:Python模块的编译版本可以并且应该在特定条件下移动。我以前从来没有听说过这样的事情,所以在显示批准这样的事情的规范之前,我会说这是一种滥用,你很幸运能够运行.pyc文件所有人都没有.py

如果您认为.pyc文件仅仅是原始编译版本的缓存,那么您可以轻松解释您观察到的所有现象:原始.py文件的路径存储在.pyc以及来自该来源的所有其他内容。如果被移动,该内容当然保持不变并将用于错误消息。

没有方法可以在错误消息中看到“真实”路径,因为加载后.pyc文件的位置不再知道;只考虑其内容,而不考虑其位置,因为将这两个内容结合起来是编译的一个步骤。解释器不会再次编译任何已编译的模块。它需要它原样。

修补.pyc文件以显示不同的路径似乎也没有意义,因为该消息用于帮助您调试问题。您可能不会在.pyc文件中调试任何内容,只能在.py文件中调试。因此,似乎应该在错误消息中包含该文件的路径。