我有一个使用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.7
更改为python
。我希望能够在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不再理解该文件是什么。也许有人可以解释为什么会这样。