Python + SVN + Windows/Mac = 语法无效?
我觉得下面这个错误可能和我通过SVN和一个使用Windows系统的同事共享代码有关。
我自己是在Mac上用Python,编辑器是TextMate。
#!/usr/bin/python
import os
from google.appengine.api import users
from google.appengine.ext import webapp
...
运行这段代码时,我遇到了一个语法错误:
events.py:2 invalid syntax
使用SVN时,是否会有行尾的问题呢?
非常感谢任何提示。
编辑
看起来这个问题并不是由SVN引起的。
有趣的是,直接在Shell中执行时没有语法错误。但是用TextMate验证(通过PyCheckMate)和尝试用GoogleAppEngineLauncher启动时却返回了错误。
4 个回答
虽然在Windows和其他操作系统之间,行结束符通常是不同的,但Python在这方面是比较宽容的。一般来说,Python对不同的行结束符没有太大问题。
我在我的Mac上运行了一个Python脚本,使用了各种不同的行结束符,结果没有遇到任何问题。需要注意的是,我是用以下命令来运行我的脚本的:
python test.py
而不是
./test.py
你可以尝试这两种方式,看看问题到底是出在Python上,还是跟你的命令行环境有关。我知道有些环境在处理shebang行的CRLF结束符时确实会遇到麻烦。
字节顺序标记?不,原生换行符才重要。
如果Python不去理会那些常见的记录结束符样式,我会感到很惊讶。
可能有些命令行工具或操作系统内核不会这样,但那样的话你会看到类似 python: bad interpreter
的错误信息。
文件开头可能有一个字节顺序标记,简称BOM,想确认一下可以用 od -c events.py
来检查。
在UTF-8编码中其实不需要也不推荐使用BOM,但出于某种原因,Windows的记事本总是喜欢在文件的第一个字符插入一个。
所以我们在评论中搞清楚了,发现用 python events.py
可以正常运行,这说明 \r
让内核在执行脚本时产生了混淆。实际上 #! interp [arg]
是由内核处理的,如果这一步失败,命令行会尝试执行它,最终导致错误的出现。解决办法可以在 svn手册 中找到,具体在属性 svn:eol-style
里。
虽然Python对行结束符不太在意,但你的Mac可能不喜欢第一行有CRLF这种行结束符,这可能就是你遇到的问题。
0000000 # ! / u s r / b i n / p y t h o n \r \n
^^
你可以通过设置svn:eol-style
属性为native
来告诉SVN处理行结束符。这样,当你在Windows上检出文件时,它会把你的LF行结束符转换成CRLF,而当你在Mac上检出文件时,它会把你同事的CRLF行结束符转换成LF。