3

我有一个使用 Pants 1.0.1 构建的 Python PEX。这个 PEX 是一个工作 python 应用程序,直到 ubuntu 16.04 和 fedora 24 使用 python 2.7.12 发布。现在我收到一个错误,表明 PEX 文件的编码错误:

$ ./ainfo_py.pex 
File "./ainfo_py.pex", line 2
SyntaxError: Non-ASCII character '\xe4' in file ./ainfo_py.pex on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

呃。zip 文件嵌入在 .pex 文件中,因此文件中自然会有非 ascii 字符。

阅读错误消息中的链接,它说我可以在文件顶部放置一个编码,但是,我认为没有可以解决这个问题的编码,是吗?

我不确定此时该怎么做。在我看来,python 2.7.12 打破了 PEX。裤子有更新可以解决这个问题吗?有什么我可以添加到 pex 文件来解决这个问题的吗?

编辑

多一点信息。我不确定为什么这最终很重要,但似乎确实如此。我在构建 PEX 文件后稍微修改它。我将文件顶部的 shebang 从 更改python2.7python. 我希望能够在 python 2.6 和 2.7 版本上运行相同的 PEX,这取决于需要运行的各种发行版上可用的任何版本。看来,如果我不理会它,因为python2.7它在 python 2.7.12 上运行良好。如果我改变它,它就不再起作用了。Ubuntu 16.04 上的默认 python 仍然是 python 2.7,那么为什么要改变python2.7才能python有所作为呢?

更多信息

如果我解压缩 PEX,我可以执行该目录,并且我希望这样做。所以我删除了 PEX 文件的第一行,它有 #! 在里面,剩下的是一个拉链。我将 zip 解压缩到一个名为 unzipped 的目录中。然后我可以python unzipped毫无问题地执行。所以源文件本身的编码似乎不是问题。我无法直接执行 zip。运行时出现同样的错误python unzipped.pyz

我的解决方案

所以这里对我的问题没有很好的答案。由于我修改了生成的 PEX 以删除python2.7要求并将其更改为python,以允许它根据分布在 python 2.6 或 2.7 上运行,我发现它是导致问题的 PEX 的修改。所以我求助于制作 2 个 PEX 文件,一个用于 python 2.7,另一个用于 python 2.6。

最后,我不明白为什么简单地触摸#!PEX 顶部的 会导致 python 不再理解该文件是什么。也许有人可以解释为什么会这样。

4

0 回答 0