【问题标题】:python script path stays same after compilation编译后python脚本路径保持不变
【发布时间】:2013-12-10 13:00:56
【问题描述】:

我意识到编译一个python脚本后,它修复了这个脚本的路径信息。

例如: 我有一个作为 /tmp/src/foo.py 的 python 脚本,它有一个打印命令

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 一个命令行参数,或者我们可以在源代码中添加一个代码段?

谢谢

【问题讨论】:

  • “有什么方法可以查看错误的真实路径?”是什么意思?您已经看到了真正的路径,对吗?你想在那里的跟踪中看到什么?
  • 为什么要手动“编译”一个脚本,为什么要把它放在不同的目录中?
  • @Forbidden Overseer 我看到了源路径。我想查看编译代码的路径。
  • .pyc 不应该与原始源分开,它们只不过是一个“缓存”。这就是你得到这条路的原因。为什么要做这样的事情?
  • @Faust 你没看问题!我没有问题。我只是想知道。

标签: python compiler-construction path compilation


【解决方案1】:

您的问题源于这样一个概念,即 Python 模块的编译版本可以而且应该在某些条件下移动。实际上我以前从未听说过这样的事情,所以在显示批准这样事情的规范之前,我会说这是一种滥用,你很幸运能够运行.pyc文件而无需.py 在它的旁边。

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

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

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

【讨论】:

  • 我可以在没有 .py 的情况下在另一台机器上运行 .pyc,即使它是一个很长的脚本。
  • 所以?那只是因为字节码到处都是一样的。
  • 我想说明这一点,因为您说“您很幸运能够在没有 .py 的情况下运行 .pyc 文件。”
  • 直到显示批准这种事情的规范” - The 2.7 Python tutorial 批准这种使用。 “对于同一个模块,可能有一个名为 spam.pyc(或使用 -O 时为 spam.pyo)的文件而没有 spam.py 文件。这可用于以如下形式分发 Python 代码库逆向工程难度适中。”
  • 很好,但并不是说你的主模块也可以这样处理(这里就是这种情况)。但另一方面,这种区别很可能是人为的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2012-12-17
  • 1970-01-01
  • 2023-01-19
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多