2013-12-10 19 views
1

我意识到,在编译python脚本之后,它修复了此脚本的路径信息。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

你的意思是“有什么方法可以看到真正的错误?”? 你看到真正的道路已经对吗? 你想在那里看到什么? –

+2

为什么你想手动“编译”一个脚本,你为什么要把它放在不同的目录中? – smeso

+0

@禁止监督我看到源路径。我想看看编译代码的路径。 – ibrahim

回答

1

你提的问题从观念,即一个Python模块的编译版本,可以也应该在一定条件下移动派生。我以前从来没有听说过这样的事情,所以在显示一个赞同这样的事情的规范之前,我会说这是一种滥用,你很幸运能够在没有.py的情况下运行.pyc文件在它的旁边。

如果您认为.pyc文件作为原始文件的编译版本的纯粹的缓存,那么你可以很容易地解释你观察到的所有现象:原来.py文件的路径存储在.pyc连同一切来自哪里该来源。如果移动,该内容当然保持不变,并将用于错误消息。

没有办法看到错误消息“真实”的路径,因为.pyc文件的地方不加载它后知道了;只考虑它的内容,而不考虑它的位置,因为把这两件事结合起来就是编译的一个步骤。解释器不会再编译任何东西到已经编译好的模块。它照原样。

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

+0

即使在另一台机器上,我也可以运行.pyc而不使用.pyc,即使它是一个长脚本。 – ibrahim

+0

那么?这是因为字节码在任何地方都是一样的。 – Alfe

+0

我想详细说明一下,因为你说“你很幸运可以在没有.py的情况下运行.pyc文件。” – ibrahim