电商网站欣赏,查询网站到期时间,天津网站建设设计开发公司,无法使用wordpress文章目录 前言1. 起因2. 调查3. 高能4. 释惑 前言 今天分享一件很诡异的事情#xff0c;我写代码的时候遇到了不可见的字符#xff01;#xff01;#xff01;
1. 起因 今天在使用pipreqs导出项目中所依赖的库时突然报错了#xff1a;
pipreqs . --encodingutf-8 --forc… 文章目录 前言1. 起因2. 调查3. 高能4. 释惑 前言 今天分享一件很诡异的事情我写代码的时候遇到了不可见的字符
1. 起因 今天在使用pipreqs导出项目中所依赖的库时突然报错了
pipreqs . --encodingutf-8 --force# 以下是报错信息
ERROR: Failed on file: ./build.py
Traceback (most recent call last):File /usr/local/bin/pipreqs, line 8, in modulesys.exit(main())File /usr/local/lib/python3.8/dist-packages/pipreqs/pipreqs.py, line 528, in maininit(args)File /usr/local/lib/python3.8/dist-packages/pipreqs/pipreqs.py, line 455, in initcandidates get_all_imports(input_path,File /usr/local/lib/python3.8/dist-packages/pipreqs/pipreqs.py, line 131, in get_all_importsraise excFile /usr/local/lib/python3.8/dist-packages/pipreqs/pipreqs.py, line 117, in get_all_importstree ast.parse(contents)File /usr/lib/python3.8/ast.py, line 47, in parsereturn compile(source, filename, mode, flags,File unknown, line 1# -*- coding:utf-8 -*-^
SyntaxError: invalid character in identifier直接来了SyntaxError#竟然是个无效字符字符#表示十分的无辜当事人表示十分的震惊这不是离天下之大谱滑天下之大稽吗这就一行代码注释能够错到哪里去 2. 调查 头一次遇到这种邪门的事情我就查看了一下pipreqs 源码代码很简单我就摘取了报错的部分
# pipreqs/pipreqs.py line 112
for file_name in files:file_name os.path.join(root, file_name)with open(file_name, r, encodingencoding) as f:contents f.read()try:tree ast.parse(contents) # 在这里报错了for node in ast.walk(tree):if isinstance(node, ast.Import):for subnode in node.names:raw_imports.add(subnode.name)elif isinstance(node, ast.ImportFrom):raw_imports.add(node.module)except Exception as exc:...意思也很好理解pipreqs读取当前工程下的所有python文件然后使用ast库进行语法分析获取python文件所依赖的库名。既然这部分报错了我就直接拿了出来此时我高度怀疑ast存在重大bug
3. 高能 为了确认ast在解析文件时存在bug我对当前工程下的所有python文件进行一一测试然而事情的发展却超出了我的预料第二个文件(process_data.py)竟然能够可以解析 我看了下这个文件开头也是一样的注释然而却没有报错。难道是编码有问题我打开了Pycharm看了一下也没有问题 这也太诡异了吧然后我又debug了一下看下文件的内容确定也没有问题 想不通了于是问了下ChatGPT 给出了四个怀疑点基本都是一一排除了python 3.8、文件为utf-8编码无语法错误注释也没有什么问题。但有一个点却无法理解不可见的特殊字符 不可见既然是个字符即使不可见也得有位置吧。于是乎最诡异的事情来了 还真的有一个空字符在第一个位置这。。。空字符还能占个位置 打印了一下ASCII发现其值竟然是65279空字符竟然有ASCII值顿时觉得这个问题不简单难道还真的不可见 4. 释惑 百度了一下发现ASCII值为65279是因为文件采用UTF-8 BOM编码导致的这是Windows环境下创建文件时默认的编码方式对此还专门看了一下还真是 这在Pycharm中也有这项设置默认情况下在Pycharm中创建新文件时会采用UTF-8 with NO BOM编码也就是常说的UTF-8而之所以ast库有的能够正常解析文件有的却不可以是可能有的文件不是在Pycharm中创建的导致了这种诡异的时间发生了。同时我用二进制的方式读了一下文件发现前三个字节是\xEF\xBB\xBF这也正是UTF-8 BOM编码时自动添加的。
py_file ./build.py
with open(py_file, r, encodingutf-8) as f:contents f.read()if ord(contents[0]) 65279:print(UTF-8 BOM)with open(py_file, rb) as f:contents f.read(3)if contents b\xEF\xBB\xBF:print(UTF-8 BOM)# UTF-8 BOM
# UTF-8 BOM于是将文件编码由UTF-8 BOM改为UTF-8问题就解决了