-
-
Notifications
You must be signed in to change notification settings - Fork 0
[W605] invalid escape sequence ‘x’ #66
Comments
具体地看了一下,除了忘记在代码中添加转义,还有这样与系统命令相关的地方也出现了同样的问题,这些地方该如何修改呢? def get_all_uts(rootPath):
all_uts_paddle = '%s/build/all_uts_paddle' % rootPath
os.system(
'cd %s/build && ctest -N -V | grep -Ei "Test[ \t]+#" | grep -oEi "\w+$" > %s'
% (rootPath, all_uts_paddle)) |
这种情况其实就是上述的混用情况
这里 # 这在 Python runtime 没有任何影响
>>> 'cd %s/build && ctest -N -V | grep -Ei "Test[ \t]+#" | grep -oEi "\w+$" > %s' == \
... 'cd %s/build && ctest -N -V | grep -Ei "Test[ \t]+#" | grep -oEi "\\w+$" > %s'
True 不过在 grep 开启 # 这在 Python runtime 会被认为是不同的字符串
>>> 'cd %s/build && ctest -N -V | grep -Ei "Test[ \t]+#" | grep -oEi "\w+$" > %s' == \
... r'cd %s/build && ctest -N -V | grep -Ei "Test[ \t]+#" | grep -oEi "\w+$" > %s'
False # 但这对 grep 而言是等价的
# 需要预先创建 build 目录编译并 cd build
# test.py
import subprocess
if __name__ == "__main__":
a = subprocess.run('ctest -N -V | grep -Ei "Test[ \t]+#"',
shell=True,
stdout=subprocess.PIPE)
b = subprocess.run(r'ctest -N -V | grep -Ei "Test[ \t]+#"',
shell=True,
stdout=subprocess.PIPE)
print(a.stdout == b.stdout)
# shell 执行以下命令
# python test.py
# 输出如下
# True 还有其他类似的 os.system 命令或者 subprocess 命令的情况吗? |
另外就是在 def set_diff_value(file, atol="1e-5", inplace_atol="1e-7"):
"""
:param file: refer to op_test.py
:param atol: refer to op_test.py
:param inplace_atol:
:return:
"""
os.system("sed -i 's/self.check_output(/self\.check_output\(atol=" + atol +
",inplace_atol=" + inplace_atol + ",/g\' " + file) 但这里直接添加 |
这应该是 Windows 上默认编码为 因此也许第 70 行需要修改成下面这样 - with open(path) as f:
+ with open(path, encoding='utf-8') as f: 不过我不太清楚这个问题是否稳定复现,因此需要之后调研一下再确定是否要修改(因为 Paddle 应该也是有不少 Windows 开发者的,貌似也没有遇到这个问题?具体复现方式需要进一步确定下) 现在的话建议先在 yapf 等其余 hook 都运行过后直接 |
我怀疑是修改包含中文的文件才会引发这样的问题?我在 PaddlePaddle/Paddle#46751 做了一下修复,这个 merge 后应该可以彻底解决问题 |
有道理,应该只有在windows下并且修改包含中文的文件才会出现这个问题。 |
此前统计 172 个,虽然看起来较多,但往往一个字符串里会出现多个该问题,实际上需要修复的位置并不是特别多,建议手动修复
该问题主要是一些忘记加自动转义标志
r
的字符串,如正则、含 LaTeX 数学公式的 docstring 等,这些直接在字符串前加r
即可因为对于错误的转义序列,如
'\l'
,Python 会自动修正为'\\l'
,不需要担心加r
后会出现问题当然,可能需要辨别下字符串里是否同时混用正确转义序列和错误转义序列,如
'\l\n'
会被认为'\\l\n'
,如果直接加r
是不对的,如果遇到这种情况需要手动修改为'\\l\n'
此外一些 docstring 会用图来表示 fuse 的 pass,如
这些同样直接加
r
即可The text was updated successfully, but these errors were encountered: