使用#!/usr/bin/env python3时lint报第一行语法错误如何解决
问题成因
这个报错和你修改尾部空白的操作直接相关,核心是两类问题:
- 文件头格式被编辑器自动操作破坏
很多编辑器在执行“删除尾部空白”“统一换行符”这类操作时,会误改文件头内容:要么在文件最开头插入了UTF-8 BOM不可见字符、把shebang行里的普通空格替换成了网页常用的非断空格(NBSP),要么误删了一二行之间的换行符把两行拼在一起,导致Python解析第一行时直接遇到非法语法。 - 版权行的注释符丢失
你贴出的代码里第二行@ Copyright 2022 All rights reserved开头没有Python要求的注释符#。Python语法里行首的@只能用来写装饰器,这里既没有对应的类/函数作为装饰对象,Copyright也不是合法的可调用装饰器,本身就是语法错误。如果文件存在换行符混用(CR/LF/CRLF乱混)的情况,lint工具的行号计数会偏移,就会把第二行的错误报在第一行。
之前能过检测就是因为这行开头本来有#,属于注释内容不会被语法解析,改空白时要么是你误删了这个#,要么是编辑器自动格式化时吞掉了这个字符。 - 少数情况是lint缓存异常:修改文件后触发了全量重扫,旧的缓存结果失效,刚好扫到了之前没检测到的文件头问题,和你改后面的空白只是时间上的巧合。
解决步骤
按顺序排查即可:
- 检查文件头原始字节
用十六进制编辑工具打开文件确认:- 文件最开头不能有
EF BB BF三个字节(也就是UTF-8 BOM),有就直接删掉 - 第一行
#!/usr/bin/env python3里的所有空格都必须是普通ASCII空格(十六进制值20),如果出现C2 A0就是特殊的NBSP空格,全部替换成普通空格 - 第一行和第二行之间必须有独立的LF换行符(十六进制
0A),不要混用CR换行,确保两行没有被拼接成同一行
- 文件最开头不能有
- 修复版权行语法
给第二行的版权声明开头补上注释符#,正确写法:#!/usr/bin/env python3 # @ Copyright 2022 All rights reserved - 清理lint缓存重检
删除lint工具生成的缓存目录(比如pylint的.pylint.d、flake8的缓存文件夹),重启编辑器的lint服务后重新检测即可。
内容的提问来源于stack exchange,提问作者medako
相关产品推荐
相关产品推荐

