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

标签 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 提供命令行参数,或者我们可以向源代码添加代码段?

最佳答案

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

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

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

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

关于Python脚本路径编译后保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495289/

相关文章:

python - Aptana (eclipse) 无法识别对 .bashrc 中编写的 PATH 的修改

linux - 绝对化 bash 中可能不存在的路径? (Linux)

javascript - 更改模块路径

python - HTTP 引用问题

python - Pandas :SettingWithCopyWarning:

python - 使用 Pytorch 实现 FFT

python - PyQt4 代码不适用于 PyQt5 (QHeaderView)

parsing - 这些语法 : LL1, SLR1、LR0、LR1 和 LALR1 的层次结构是什么?

java - 如何从文件夹结构中获取文件列表

c++ - 是否可以查看在命令行应用程序运行后执行了哪些行?