Python + SVN + Windows/Mac = 语法无效?

0 投票
4 回答
942 浏览
提问于 2025-04-15 15:21

我觉得下面这个错误可能和我通过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 个回答

1

虽然在Windows和其他操作系统之间,行结束符通常是不同的,但Python在这方面是比较宽容的。一般来说,Python对不同的行结束符没有太大问题。

我在我的Mac上运行了一个Python脚本,使用了各种不同的行结束符,结果没有遇到任何问题。需要注意的是,我是用以下命令来运行我的脚本的:

python test.py

而不是

./test.py

你可以尝试这两种方式,看看问题到底是出在Python上,还是跟你的命令行环境有关。我知道有些环境在处理shebang行的CRLF结束符时确实会遇到麻烦。

1

字节顺序标记?不,原生换行符才重要。

如果Python不去理会那些常见的记录结束符样式,我会感到很惊讶。

可能有些命令行工具或操作系统内核不会这样,但那样的话你会看到类似 python: bad interpreter 的错误信息。

文件开头可能有一个字节顺序标记,简称BOM,想确认一下可以用 od -c events.py 来检查。

在UTF-8编码中其实不需要也不推荐使用BOM,但出于某种原因,Windows的记事本总是喜欢在文件的第一个字符插入一个。

所以我们在评论中搞清楚了,发现用 python events.py 可以正常运行,这说明 \r 让内核在执行脚本时产生了混淆。实际上 #! interp [arg] 是由内核处理的,如果这一步失败,命令行会尝试执行它,最终导致错误的出现。解决办法可以在 svn手册 中找到,具体在属性 svn:eol-style 里。

4

虽然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。

撰写回答